0

我有一个烦人的问题,即使条件匹配我系统中的多个用户,也只有其中一个用户提取了特定的数组。

这可能是用户的样子:

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

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

我目前使用这个:

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

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

4

2 回答 2

4

你正在做一个单一的更新。MongoDB 更新的默认行为是仅修改与条件匹配的第一个文档,而不是像 RDBMS 中常见的那样修改所有匹配的文档。

更新有签名update(criteria, update, upsert, multiple)。最后一个参数是一个布尔值,告诉 MongoDB 更新所有匹配的文档而不是第一个。

将您的更新更改为:

db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}}, false, true)
于 2012-07-06T09:29:09.303 回答
1
db.users.update({"campaigns.userchannel" : 1}, {$pull : {"campaigns" : {"id": ObjectId("4ff59640acf479392600015b")}}},false,true) 

upsert 的第三个参数和 multi 的第四个参数。所以你需要将multi设置为true

于 2012-07-06T09:39:46.090 回答