Problem w twoim kodzie to dot-notation ponieważ podczas określania notacji z kropką zakłada się, że określone kryteria filtrowania muszą odpowiadać pojedynczemu elementowi tablicy, który spełnia wszystkie kryteria. Ale tak nie jest. Notacja kropkowa na tablicach może pobrać dowolny element tablicy, jeśli spełnia dowolne pojedyncze kryterium. Dlatego otrzymujesz nieoczekiwaną aktualizację.
Musisz użyć $elemMatch
aby dopasować wszystkie filtry w 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")
}
})
a wyjście to
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}