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.