Vấn đề trong mã của bạn là dot-notation
bởi vì Khi bạn chỉ định ký hiệu dấu chấm, bạn giả sử rằng tiêu chí bộ lọc được chỉ định phải khớp với phần tử mảng duy nhất đáp ứng tất cả các tiêu chí. Nhưng nó không. Ký hiệu dấu chấm trên mảng có thể nhận bất kỳ phần tử mảng nào nếu bất kỳ tiêu chí đơn lẻ nào phù hợp. Đó là lý do tại sao bạn nhận được bản cập nhật bất ngờ.
Bạn phải sử dụng $elemMatch
để khớp với tất cả các bộ lọc trong array
yếu tố.
db.coll.update({
'_id' : 28,
n: {
$elemMatch:{
a : new ObjectId('4ef85a3e46b3b84408000000'),
c : 28 }
}
},
{
$push : {
'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74")
},
$set : {
'n.$.t' : ISODate("2013-05-13T14:22:46.777Z")
}
})
và đầu ra là
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}