Bạn cũng có thể thử mã positional $ >
toán tử được sử dụng với findAndModify ()
phương pháp. Toán tử sẽ xác định phần tử trong một mảng để cập nhật mà không chỉ định rõ ràng vị trí của phần tử trong mảng. Lưu ý, trường mảng phải xuất hiện như một phần của tài liệu truy vấn và để trả lại tài liệu với các sửa đổi được thực hiện trên bản cập nhật, hãy sử dụng tùy chọn mới, do đó, bản cập nhật của bạn sẽ giống như
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
sẽ tạo ra sự kiện:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Vì bạn muốn trả lại tài liệu đã cập nhật, với phép chiếu vị trí $ chiếu
toán tử chỉ có thể được sử dụng trong tài liệu chiếu của find ()
hoặc findOne ()
nên findAndModify ()
trường của
tùy chọn sẽ không chiếu phần đó của mảng bằng cách sử dụng $ chiếu
nhà điều hành.
Một giải pháp thay thế là sử dụng JavaScript gốc filter ()
trên trường arr được trả về là
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
var updated = []
if (result && result.arr) updated = result.arr.filter(function (item) { return item.cond == 4; });
printjson(updated);
Điều này sẽ in
[ { "cond" : 4, "upd" : 55 } ]
- CẬP NHẬT -
Hoặc $ elemMatch
như bạn đã đề xuất trong các bình luận bên dưới:
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: {"arr": {"$elemMatch": { "cond": 4 } }, "_id": 0 }
})
printjson(result);
Đầu ra :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }