Le problème dans votre code est dot-notation
car Lorsque vous spécifiez la notation par points, vous supposez que les critères de filtre spécifiés doivent correspondre à l'élément de tableau unique qui satisfait à tous les critères. Mais ce n'est pas le cas. La notation par points sur les tableaux peut sélectionner n'importe quel élément du tableau si un seul critère correspond. C'est pourquoi vous obtenez la mise à jour inattendue.
Vous devez utiliser $elemMatch
pour faire correspondre tous les filtres du array
élément.
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")
}
})
et la sortie est
{
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"c" : 28,
"p" : [
ObjectId("4f00631046b3b85002000000"),
ObjectId("4b97e62bf1d8c7152c9ccb74")
],
"t" : ISODate("2013-05-13T14:22:46.777Z"),
"u" : 26
}