Mongodb met à jour l'élément spécifique de subarray
J'ai une collection avec un schéma suivant:
{
"_id" : 28,
"n" : [{
"a" : ObjectId("4ef8466e46b3b8140e000000"),
"c" : 28,
"p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")],
"u" : 26
}, {
"a" : ObjectId("4ef8466e46b3b8140e000000"),
"c" : 10,
"p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")],
"u" : 26
}, {
"a" : ObjectId("4ef8467846b3b8780d000001"),
"u" : 26,
"p" : [ObjectId("4f00637b46b3b8cc0e000000")],
"c" : 28
}, {
"a" : ObjectId("4ef85a3e46b3b84408000000"),
"u" : 26,
"p" : [ObjectId("4f00631046b3b85002000000")],
"c" : 28
}]
}
J'ai besoin de mettre à jour les éléments du tableau dans le document avec _id = 28
mais seulement si a = à une certaine valeur, et c = la valeur
db.coll.update({
'_id' : 28,
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'),
'n.c' : 28
},
{
$push : {
'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74")
},
$set : {
'n.$.t' : ISODate("2013-05-13T14:22:46.777Z")
}
})
Donc, fondamentalement, je veux mettre à jour spécifique de l'élément de la matrice:
et comme on peut le voir, c'est le quatrième élément. Le problème est que lorsque la requête est en cours d'exécution, il est probable qu'il met à jour le premier élément.
Comment puis-je résoudre ce problème?
source d'informationauteur Salvador Dali
Vous devez vous connecter pour publier un commentaire.
Le problème dans votre code est
dot-notation
parce que Lorsque vous spécifiez le point vous supposez que le filtre des critères spécifiés doivent correspondre à l'élément de tableau unique qui répond à tous les critères. Mais il ne marche pas. La notation point sur les tableaux peuvent ramassage de tout élément de tableau, si un seul des critères de matchs. C'est pourquoi vous obtenez la mise à jour inattendue.Vous devez utiliser
$elemMatch
pour correspondre à tous les filtres de laarray
élément.et la sortie est