我有一个恼人的问题,即使标准与我的系统中的多个用户匹配,只有其中一个用户已经拉出了特定的数组。
这就是用户的样子:
{
"_id" : ObjectId("4ff696cf246951c8cea8506c"),
"campaigns" : [
{
"userchannel" : 1,
"id" : ObjectId("4ff59640acf479392600015b"),
"name" : "test3"
}
],
}
一个用户可以拥有多个广告系列,但只有一个广告系列具有相同的名称。当我删除广告系列时,我想要更新包含此广告系列的用户的用户。只应删除包含userchannel : 1
广告系列的用户。
我目前使用它:
db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}})
但它只会删除一个用户的广告系列。如何改进此查询,以便从所有用户中删除特定广告系列?
答案 0 :(得分:4)
您正在进行一次更新。 MongoDB更新的默认行为是仅修改与条件匹配的第一个文档,而不是像RDBMS中常见的那样修改所有匹配文档。
更新具有签名update(criteria, update, upsert, multiple)
。最后一个参数是一个布尔值,告诉MongoDB更新所有匹配的文档而不是第一个。
将您的更新更改为:
db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}}, false, true)
答案 1 :(得分:1)
db.users.update({"campaigns.userchannel" : 1}, {$pull : {"campaigns" : {"id": ObjectId("4ff59640acf479392600015b")}}},false,true)
upsert的第3个参数 和 第四个参数为multi。 所以你需要将multi设置为true