Problemet i din kod är dot-notation
eftersom när du anger punktnotationen antar du att de angivna filterkriterierna måste matcha det enda matriselementet som uppfyller alla kriterier. Men det gör det inte. Punktnotation på arrayer kan hämta vilket arrayelement som helst om något enstaka kriterium matchar. Det är därför du får den oväntade uppdateringen.
Du måste använda $elemMatch
för att matcha alla filter i array
element.
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")
}
})
och utgången är
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}