.update()
phương thức trong mongoose nhận ba đối số cho lệnh gọi lại, là err
, numAffected
và một raw
phản ứng. Sử dụng đối tượng "raw" để xem điều gì đã xảy ra:
Member.update({user_id : 1},
{$set : {name:"name1"}},
{upsert : true },
function (err, numAffected, raw) {
if (!err) {
console.log(raw)
}
});
Bạn sẽ thấy một cấu trúc như thế này:
{ ok: true,
n: 1,
updatedExisting: false,
upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }
Vì vậy, luôn có n
và các khóa 'updatedExisting keys available, where the second is false on upserts and true otherwise.
uperted will contain the
_id` giá trị của bất kỳ tài liệu mới nào được tạo.
Đối với n
hoặc "numAffected", về cơ bản đây luôn là 1 trong đó tài liệu được so khớp theo phản hồi quan tâm viết cũ.
Bạn có thể xem phản hồi WriteResult mới trong MongoDB 2.6 trở lên bằng cách sử dụng biểu mẫu Hoạt động hàng loạt:
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 ) );
}
Mà trong lần lặp đầu tiên, bạn nhận được một cái gì đó như thế này:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 1,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": [
{
"index": 0,
"_id": "5456fff138209001a6b5e1c0"
}
]
}
Và một giây với các thông số tương tự như sau:
{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 0,
"nMatched": 1,
"nModified": 0,
"nRemoved": 0,
"upserted": []
}
Và tài liệu sẽ chỉ được đánh dấu là "đã sửa đổi" khi có điều gì đó thực sự đã được thay đổi.
Vì vậy, ở bất kỳ mức độ nào, .update()
các thao tác không trả lại tài liệu đã sửa đổi hoặc tài liệu gốc. Đó là .findOneAndUpdate()
phương thức, một trình bao bọc mongoose xung quanh .findAndModify()
cơ bản mà thực hiện một hoạt động nguyên tử. .update()
các phương thức thường dành cho các hoạt động hàng loạt và như vậy không trả về nội dung tài liệu.