.update()
metod i mongoose tar tre argument till återuppringningen, som är err
, numAffected
och en raw
svar. Använd det "råa" objektet för att se vad som hände:
Member.update({user_id : 1},
{$set : {name:"name1"}},
{upsert : true },
function (err, numAffected, raw) {
if (!err) {
console.log(raw)
}
});
Du kommer att se en struktur så här:
{ ok: true,
n: 1,
updatedExisting: false,
upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }
Så det finns alltid n
och 'updatedExistingkeys available, where the second is false on upserts and true otherwise.
upsertedwill contain the
_id`-värden för alla nya dokument som skapats.
När det gäller n
eller "antalAffected", detta är i princip alltid 1 där ett dokument matchades under de äldre skrivproblemsvaren.
Du kan se det nya WriteResult-svaret i MongoDB 2.6 och senare med hjälp av formuläret Bulk Operations:
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 ) );
}
Som vid en första iteration får du något sånt här:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 1,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": [
{
"index": 0,
"_id": "5456fff138209001a6b5e1c0"
}
]
}
Och en andra med samma parametrar så här:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 0,
"nMatched": 1,
"nModified": 0,
"nRemoved": 0,
"upserted": []
}
Och dokumentet skulle bara markeras som "modifierat" där något faktiskt ändrades.
Så i alla fall .update()
operationer returnerar inte det ändrade dokumentet eller originaldokumentet. Det är .findOneAndUpdate()
metoden, en mungos omslag runt den grundläggande .findAndModify()
som utför en atomoperation. .update()
Metoder är vanligtvis avsedda för bulkoperationer och returnerar som sådana inte dokumentinnehåll.