Проблемът във вашия код е dot-notation
тъй като когато зададете нотацията с точка, вие приемате, че посочените критерии за филтър трябва да съответстват на единичния елемент на масива, който отговаря на всички критерии. Но не става. Точковата нотация на масиви може да вземе всеки елемент от масива, ако някой от критериите съвпада. Ето защо получавате неочакваната актуализация.
Трябва да използвате $elemMatch
за да съответства на всички филтри в array
елемент.
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")
}
})
и изходът е
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}