如何在mongo上删除嵌套数组中的项目

时间:2017-01-11 11:01:19

标签: arrays mongodb nested updates

我需要删除嵌套数组中的项目,以下是我的文档

{
    "_id" : ObjectId("58760d8caa30c585ef8d3beb"),
    "results" : [ 
        {
            "item" : "A",
            "score" : 5.0,
            "answers" : [ 
                {
                    "q" : 1.0,
                    "a" : 4.0
                }, 
                {
                    "q" : 1.0,
                    "a" : 5.0
                }, 
                {
                    "q" : 2.0,
                    "a" : 6.0
                }
            ]
        }, 
        {
            "item" : "B",
            "score" : 8.0,
            "answers" : [ 
                {
                    "q" : 1.0,
                    "a" : 7.0
                }, 
                {
                    "q" : 1.0,
                    "a" : 5.0
                }, 
                {
                    "q" : 2.0,
                    "a" : 9.0
                }
            ]
        }
    ]
}

我想删除q等于1.0的答案中的所有项目,以下是期待文档:

{
    "_id" : ObjectId("58760d8caa30c585ef8d3beb"),
    "results" : [ 
        {
            "item" : "A",
            "score" : 5.0,
            "answers" : [ 
                {
                    "q" : 2.0,
                    "a" : 6.0
                }
            ]
        }, 
        {
            "item" : "B",
            "score" : 8.0,
            "answers" : [ 
                {
                    "q" : 2.0,
                    "a" : 9.0
                }
            ]
        }
    ]
}

我用过:

db.getCollection('test').update({"results.answers.q":1},
                                { $pull: {"results.$.answers": {q:1} } },
                                { multi: true })

但得到了:

{
    "_id" : ObjectId("58760d8caa30c585ef8d3beb"),
    "results" : [ 
        {
            "item" : "A",
            "score" : 5.0,
            "answers" : [ 
                {
                    "q" : 2.0,
                    "a" : 6.0
                }
            ]
        }, 
        {
            "item" : "B",
            "score" : 8.0,
            "answers" : [ 
                {
                    "q" : 1.0,
                    "a" : 7.0
                }, 
                {
                    "q" : 1.0,
                    "a" : 5.0
                }, 
                {
                    "q" : 2.0,
                    "a" : 9.0
                }
            ]
        }
    ]
}
项目B中的

仍然嵌入了q等于1的文件

我该怎么办?

3 个答案:

答案 0 :(得分:1)

不幸的是,单个查询无法实现此结果,除非有人能够使用$where运算符来思考一些非常智能的东西。使用位置运算符意味着您只能定位单个数组元素(在您的情况下,它是单个results元素),并且这种用法在任何子数组中都是必须的。

这里一个丑陋的解决方法是执行此更新 N 次,其中 N results数组的长度。这种方法可以完成这项工作,但如果这些数组很大,显然会出现巨大的性能问题。

答案 1 :(得分:0)

使用以下查询将适合您。有关$ pull的更多信息,请访问https://docs.mongodb.com/manual/reference/operator/update/pull/

db.getCollection('test').update({},{ $pull: {"results":{"answers": {$elemMatch:{q:1} }} }},{ multi: true });

答案 2 :(得分:0)

根据MongoDB文档,您现在可以使用$ pull实现此目标:https://docs.mongodb.com/manual/reference/operator/update/pull/#pull-array-of-documents