Problém ve vašem kódu je dot-notation
protože když zadáte tečkovou notaci, předpokládáte, že zadaná kritéria filtru musí odpovídat jedinému prvku pole, který splňuje všechna kritéria. Ale není. Tečkový zápis na polích může vyzvednout jakýkoli prvek pole, pokud se shoduje jedno kritérium. Proto dostáváte neočekávanou aktualizaci.
Musíte použít $elemMatch
aby odpovídaly všem filtrům v array
živel.
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 výstup je
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}