3 votes

mongodb remplace toutes les instances d'une certaine valeur pour le sous-document

Ma collection (appelée "travailleurs") :

"_id" : "500"
"type" : "Manager",
"employees" : [{
"name" : "bob"
"id" : 101
},{
"name" : "phil"
"id" : 102
}]

Objectif : pour chaque _id qui est un type : Manager ET qui contient un sous-document dont l'"id" est 102 : remplacer 102 par 202.

Résultat final souhaité :

"_id" : "500"
"type" : "Manager",
"employees" : [{
"name" : "bob"
"id" : 101
},{
"name" : "phil"
"id" : 202
}]

J'ai essayé :

db.workers.update({type:'Manager','employees.id':'102'},{$set:{'employees.id':'202'}},{multi:true})

J'ai ensuite fait les deux choses suivantes pour vérifier :

db.workers.find({type: "Manager", 'employees.id': 102}).count()

J'obtiens un résultat de 9.

J'ai également essayé ceci pour vérifier :

db.workers.find({$and: [{type: "Manager"},{"employees.id":60}]}).count()

Le résultat est de 0.

Je suis assez confus à ce stade. Ma mise à jour est-elle erronée ? Ma recherche est-elle erronée ? Les deux ? Le résultat '9' est-il faux ? Le '0' est-il erroné ?

4voto

JohnnyHK Points 61191

Vous devez utiliser le $ contrôle de position pour mettre à jour l'élément spécifique qui correspond à votre requête. Votre mise à jour utilise également les valeurs de '102' et '202' ce qui fait que la mise à jour essaie de faire correspondre des chaînes de caractères lorsque ces champs sont des chiffres.

Votre mise à jour devrait plutôt ressembler à ceci :

db.workers.update(
    {type: 'Manager', 'employees.id': 102}, 
    {$set: {'employees.$.id': 202}}, 
    {multi: true})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X