MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb met à jour l'élément spécifique du sous-tableau

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
    }