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
}