使用$ pull删除MongoDB中的(子)数组

时间:2013-10-29 07:33:42

标签: mongodb

所以..我正在评估Mongodb管理我的JSON后端。我完全是新手,我有一个问题,在代码中做得很麻烦,所以我想 - 哎呀 - 让我看看是否是时候终于开始使用Mongo了

我的数据结构大致如下:

[
{
    "_id" : ObjectId("526f59ee82f2e293f9833c54"),
    "humans" : [
        {
            "serviceUsers" : [
                {
                    "foo1" : "bar2",
                    "foo2" : "bar3"
                },
                {
                    "foo1" : "baz2",
                    "foo2" : "baz3"
                }
            ]
        }
    ]
}
]

现在我想删除任何“foo1”等于“baz2”的serviceUsers数组元素,这样理想情况下我最终会得到这个:

[
{
    "_id" : ObjectId("526f59ee82f2e293f9833c54"),
    "humans" : [
        {
            "serviceUsers" : [
                {
                    "foo1" : "bar2",
                    "foo2" : "bar3"
                },
            ]
        }
    ]
}
]

我认为$pull是开始的地方。我尝试了一堆扭曲。如果我在收集mytests,我试过

db.mytests.update({"humans.serviceUsers.foo1":"baz2"}, {$pull:{"humans.serviceUsers" : {"foo1":"baz2"}}}, {multi: true})

对于我公认的天真的眼睛,似乎它应该遵循$pull语法:

db.collection.update( { field: <query> }, { $pull: { field: <query> } } );

Mongo不抱怨。但它也不会以任何方式改变集合。

我也试过

db.mytests.update({}, {$pull:{"humans.serviceUsers" : {"foo1":"baz2"}}}, {multi: true})

哪个也失败了。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:3)

因此humans也是数组,您应该使用位置$运算符来访问匹配的serviceUsers元素的humans数组:

db.mytests.update({ "humans.serviceUsers.foo1" : "baz2" },
                  { $pull: { "humans.$.serviceUsers" : { "foo1": "baz2" }}});