MongoDB - 如何对对象中的多个属性进行查询并对结果进行分组

时间:2012-04-12 01:44:05

标签: mongodb

尝试学习MongoDB,我似乎无法弄清楚如何做到这一点。

假设我有三个这样的对象:

         {
            "_id": 99990,
            "type" : 15,
            "attributes": [
                {
                    "id": 1,
                    "value": 115
                }
            ]
        },
        {
            "_id": 99991,
            "type" : 5,
            "attributes": [
                {
                    "id": 1,
                    "value": 120
                }
            ]
        },
        {
            "_id": 99992,
            "type" : 5,
            "attributes": [
                {
                    "id": 1,
                    "value": 120
                }
            ]
        },
        {
            "_id": 99993,
            "type" : 5,
            "attributes": [
                {
                    "id": 1,
                    "value": 150
                }
            ]
        },

如何根据属性“id”1搜索项目并仅返回id为99993,值为150?我今天刚开始玩MongoDB,所以这可能是一个非常基本的问题。

要添加挑战,我如何通过attributes / id / value对类型5的每个项目的结果进行分组,并获得如下结果:

 "id" : 1, "value" : 150, "count" : 1
 "id" : 1, "value" : 120: "count" : 2

这只是示例数据,架构非常复杂,但就本练习而言,它应该足够了。

2 个答案:

答案 0 :(得分:5)

对于第一部分,您应该能够通过执行以下操作来检索该记录:

db.collectionName.find({"attributes.id": 1, "attributes.value": 150});

这将从任何具有属性数组元素的对象中检索_id字段,该元素具有id = 1和value = 150。

由于问题的第二部分涉及返回匹配计数,因此您应该使用map-reduce探索您的选项。您无法使用简单的Mongo查询生成该结果。

答案 1 :(得分:0)

由于“属性”是对象数组,因此应在查询中使用“ $ elemMatch”。

db.collectionName.find(
   {
       "attributes" : {
           $elemMatch : {
               "id" : 1, 
               "value": 150
           }
       }
   }
);

如果我们使用建议的查询@clexmond,还将返回下面提到的示例文档,这是不正确的。

   {
        "_id": 99999,
        "type" : 5,
        "attributes": [
            {
                "id": 1,
                "value": 170
            },
            {
                "id": 2,
                "value": 150
            }
        ]
    }

问题的第二部分,即使我也不知道。我希望看到答案。如果有的话请分享。