查询以在mongodb中检索数组中的多个对象

时间:2015-01-14 07:17:41

标签: mongodb mongodb-query aggregation-framework

假设我有一个对象数组,如下所示。

"array" : [ 
    {
        "id" : 1
    }, 
    {
        "id" : 2
    }, 
    {
        "id" : 2
    }, 
    {
        "id" : 4
    }
]

如果我想从此数组中检索多个对象( {id:2} ),则聚合查询将如下所示。

db.coll.aggregate([{ $match : {"_id" : ObjectId("5492690f72ae469b0e37b61c")}}, { $unwind : "$array"}, { $match : { "array.id" : 2}}, { $group : { _id : "$_id", array : { $push : { id : "$array.id"}}}}  ])

以上聚合的输出是

   {
        "_id" : ObjectId("5492690f72ae469b0e37b61c"),
        "array" : [ 
            {
                "id" : 2
            }, 
            {
                "id" : 2
            }
        ]
    }

现在的问题是: 1)是否可以使用MongoDB中的 find()从数组中检索多个对象

2)关于性能,聚合是正确的方法吗? (因为我们需要使用四个管道运算符)?

3)我们可以使用Java操作(循环数组并且只保留{id:2}对象)来执行此操作 查找({“_ id”:ObjectId(“5492690f72ae469b0e37b61c”)})查询?因为find将检索文档并将其保存在RAM中。但是如果我们使用聚合,则需要在RAM中执行四个操作以获得输出。

为什么我问3)问题是:假设如果数千个客户端同时访问,则RAM内存将被重载。如果使用Java完成,则RAM上的任务较少。

4) workSet在RAM中的持续时间 ??

我的理解是否正确???

如果我错了,请纠正我。

请建议我对此有正确的见解..

1 个答案:

答案 0 :(得分:3)

  1. 没有。您将第一个匹配的项目与$进行投影,投影所有项目,或者不投影任何项目。

  2. 没有肥胖型。如果必须使用此数组,聚合将允许您提取多个匹配元素,但从概念上和性能上,正确的解决方案是设计文档结构,以便不会出现此问题,或仅出现罕见查询其表现并不是特别重要。

  3. 我们没有任何信息可以让我们对这个问题给出合理的答案。相对于问题的其余部分,这也超出了范围,应该是一个单独的问题。