4

我正在尝试学习 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
                }
            ]
        },

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

为了增加挑战,我如何按属性/id/值对类型 5 的每个项目的结果进行分组,并获得如下结果:

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

这只是示例数据,模式非常复杂,但对于本练习而言,它应该足够了。

4

2 回答 2

7

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

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

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

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

于 2012-04-12T01:56:21.150 回答
1

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

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

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

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

问题的第二部分连我也不知道。我想看看这个问题的答案。如果你已经有了,请分享。

于 2018-11-19T06:29:26.760 回答