MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mangusto para determinar se o update-upsert está fazendo inserção ou atualização


O .update() O método no mangusto recebe três argumentos para o retorno de chamada, sendo err , o numAffected , e um raw resposta. Use o objeto "raw" para ver o que aconteceu:
Member.update({user_id : 1}, 
    {$set : {name:"name1"}}, 
    {upsert : true }, 
    function (err, numAffected, raw) {
    if (!err) {
        console.log(raw)
    }
});

Você verá uma estrutura como esta:
{ ok: true,
  n: 1,
  updatedExisting: false,
  upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }

Portanto, há sempre o n e 'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain the _id` de quaisquer novos documentos criados.

Quanto a n ou o "numAffected", isso é basicamente sempre 1 onde um documento foi correspondido nas respostas de preocupação de gravação herdadas.

Você pode ver a nova resposta WriteResult no MongoDB 2.6 e superior usando o formulário de operações em massa:
var bulk = Member.collection.initializeOrderedBulkOp();
bulk.find({user_id : 1}.upsert().update({$set : {name:"name1"}});
bulk.execute(err,result) {
   console.log( JSON.stringify( result, undefined, 2 ) );
}

Que em uma primeira iteração você obtém algo assim:
{
  "ok": 1,
  "writeErrors": [],
  "writeConcernErrors": [],
  "nInserted": 0,
  "nUpserted": 1,
  "nMatched": 0,
  "nModified": 0,
  "nRemoved": 0,
  "upserted": [
    {
      "index": 0,
      "_id": "5456fff138209001a6b5e1c0"
    }
  ]
}

E um segundo com os mesmos parâmetros assim:
{
  "ok": 1,
  "writeErrors": [],
  "writeConcernErrors": [],
  "nInserted": 0,
  "nUpserted": 0,
  "nMatched": 1,
  "nModified": 0,
  "nRemoved": 0,
  "upserted": []
}

E o documento só seria marcado como "modificado" onde algo fosse realmente alterado.

Então, de qualquer forma, .update() operações não retornam o documento modificado ou o documento original. Esse é o .findOneAndUpdate() método, um wrapper mangusto em torno do básico .findAndModify() que realiza uma operação atômica. O .update() Os métodos geralmente são destinados a operações em massa e, como tal, não retornam o conteúdo do documento.