.update()
методът в mongoose приема три аргумента за обратното извикване, като err
, numAffected
и raw
отговор. Използвайте "суровия" обект, за да видите какво се е случило:
Member.update({user_id : 1},
{$set : {name:"name1"}},
{upsert : true },
function (err, numAffected, raw) {
if (!err) {
console.log(raw)
}
});
Ще видите структура като тази:
{ ok: true,
n: 1,
updatedExisting: false,
upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }
Така че винаги има n
и 'updatedExistingkeys available, where the second is false on upserts and true otherwise.
upsertedwill contain the
_id` стойности на всички създадени нови документи.
Що се отнася до n
или „numAffected“, това всъщност винаги е 1, когато документът е съпоставен в отговорите за загриженост за наследено писане.
Можете да видите новия отговор WriteResult в MongoDB 2.6 и по-нова версия, като използвате формуляра за групови операции:
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 ) );
}
Което при първа итерация ще получите нещо подобно:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 1,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": [
{
"index": 0,
"_id": "5456fff138209001a6b5e1c0"
}
]
}
И втори със същите параметри като този:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 0,
"nMatched": 1,
"nModified": 0,
"nRemoved": 0,
"upserted": []
}
И документът ще бъде маркиран като „модифициран“ само там, където нещо действително е било променено.
Така че във всеки случай, .update()
операциите не връщат модифицирания документ или оригиналния документ. Това е .findOneAndUpdate()
метод, mongoose обвивка около основния .findAndModify()
който извършва атомарна операция. .update()
методите обикновено са предназначени за групови операции и като такива не връщат съдържание на документ.