Nếu bạn đang sử dụng MongoDB 3.0 hoặc mới hơn, bạn cần sử dụng .findOneAndUpdate()
và sử dụng projection
tùy chọn để chỉ định tập hợp con của các trường để trả về. Bạn cũng cần đặt returnNewDocument
thành true
. Tất nhiên, bạn cần sử dụng $elemMatch
toán tử phép chiếu ở đây vì bạn không thể sử dụng phép chiếu vị trí và trả lại tài liệu mới.
Như ai đó đã chỉ ra:
Bạn nên sử dụng
.findOneAndUpdate()
bởi vì.findAndModify()
được đánh dấu là không còn được dùng trong mọi trình điều khiển ngôn ngữ chính thức. Điều khác là cú pháp và các tùy chọn khá nhất quán giữa các trình điều khiển cho.findOneAndUpdate()
. Với.findAndModify()
, hầu hết các trình điều khiển không sử dụng cùng một đối tượng duy nhất với các phím "truy vấn / cập nhật / trường". Vì vậy, sẽ đỡ khó hiểu hơn một chút khi ai đó áp dụng một ngôn ngữ khác để được nhất quán. Các thay đổi API được tiêu chuẩn hóa cho.findOneAndUpdate()
thực sự tương ứng với bản phát hành máy chủ 3.x thay vì 3.2.x. Sự khác biệt đầy đủ là các phương thức shell thực sự tụt hậu so với các trình điều khiển khác (một lần!) Trong việc triển khai phương thức. Vì vậy, hầu hết các trình điều khiển thực sự đã có một đợt phát hành lớn tương ứng với bản phát hành 3.x với những thay đổi như vậy.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
Từ MongoDB 3.0 trở đi, bạn cần sử dụng findAndModify
và các trường fields
các tùy chọn bạn cũng cần đặt new
thành true
khác để trả về giá trị mới.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
Cả hai truy vấn đều mang lại:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}