从符合条件的用户中拉出所有数组

时间:2012-07-06 08:46:59

标签: mongodb

我有一个恼人的问题,即使标准与我的系统中的多个用户匹配,只有其中一个用户已经拉出了特定的数组。

这就是用户的样子:

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

一个用户可以拥有多个广告系列,但只有一个广告系列具有相同的名称。当我删除广告系列时,我想要更新包含此广告系列的用户的用户。只应删除包含userchannel : 1广告系列的用户。

我目前使用它:

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

但它只会删除一个用户的广告系列。如何改进此查询,以便从所有用户中删除特定广告系列?

2 个答案:

答案 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