.update()
metoden i mongoose tager tre argumenter til tilbagekaldet, nemlig err
, numAffected
, og en raw
respons. Brug det "rå" objekt til at se, hvad der skete:
Member.update({user_id : 1},
{$set : {name:"name1"}},
{upsert : true },
function (err, numAffected, raw) {
if (!err) {
console.log(raw)
}
});
Du vil se en struktur som denne:
{ ok: true,
n: 1,
updatedExisting: false,
upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }
Så der er altid n
og 'updatedExistingkeys available, where the second is false on upserts and true otherwise.
upsertedwill contain the
_id` værdier for eventuelle nye dokumenter, der er oprettet.
Med hensyn til n
eller "antalAffected", dette er stort set altid 1, hvor et dokument blev matchet under de ældre skrivebekymringssvar.
Du kan se det nye WriteResult-svar i MongoDB 2.6 og nyere ved at bruge formularen 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 ved en første iteration får du noget som dette:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 1,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": [
{
"index": 0,
"_id": "5456fff138209001a6b5e1c0"
}
]
}
Og et sekund med de samme parametre som denne:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 0,
"nMatched": 1,
"nModified": 0,
"nRemoved": 0,
"upserted": []
}
Og dokumentet vil kun blive markeret som "modificeret", hvor noget rent faktisk blev ændret.
Så i hvert fald .update()
handlinger returnerer ikke det ændrede dokument eller det originale dokument. Det er .findOneAndUpdate()
metode, en mangust-indpakning omkring den grundlæggende .findAndModify()
som udfører en atomoperation. .update()
metoder er typisk beregnet til masseoperationer og returnerer som sådan ikke dokumentindhold.