2012-07-06 1 views
0

J'ai un problème ennuyeux, et c'est que même si le critère correspond à plusieurs utilisateurs dans mon système, un seul d'entre eux a tiré le tableau spécifique.Tirez tous les tableaux des utilisateurs correspondant aux critères

Voici comment un utilisateur pourrait ressembler à:

{ 
    "_id" : ObjectId("4ff696cf246951c8cea8506c"), 
    "campaigns" : [ 
     { 
      "userchannel" : 1, 
      "id" : ObjectId("4ff59640acf479392600015b"), 
      "name" : "test3" 
     } 
    ], 
} 

Un utilisateur peut avoir plusieurs campagnes, mais une seule avec le même nom. Lorsque je supprime la campagne que je souhaite mettre à jour, les utilisateurs des utilisateurs qui la contiennent sont supprimés. Seuls les utilisateurs avec une campagne contenant userchannel : 1 doivent être supprimés.

J'utilise actuellement ceci:

db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}}) 

Mais il ne supprime que la campagne pour un utilisateur. Comment puis-je améliorer cette requête afin qu'elle supprime la campagne spécifique de tous les utilisateurs?

Répondre

4

Vous effectuez une mise à jour unique. Le comportement par défaut des mises à jour de MongoDB consiste à modifier uniquement le premier document correspondant aux critères plutôt que tous les documents correspondants, comme cela est courant dans le SGBDR.

les mises à jour ont la signature update(criteria, update, upsert, multiple). Le dernier paramètre est un booléen qui indique à MongoDB de mettre à jour tous les documents correspondants plutôt que le premier.

Changer votre mise à jour:

db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}}, false, true) 
+0

J'ai un problème quand j'essaye d'implémenter la solution: ' Attention: MongoCollection :: update() attend au plus 3 paramètres, 4 donnés dans/application/models/Campaigns.php à la ligne 59'. Il semble qu'il n'aime pas le 4ème paramètre .. :( – Ms01

+0

Nvm, php avait un tableau pour déclarer des options supplémentaires: http://www.php.net/manual/fr/mongocollection.update.php – Ms01

1
db.users.update({"campaigns.userchannel" : 1}, {$pull : {"campaigns" : {"id": ObjectId("4ff59640acf479392600015b")}}},false,true) 

3ème paramètre pour le paramètre upsert et 4 pour le multi. Donc vous devez mettre multi à vrai

Questions connexes