使用mongodb的多级$ group

时间:2019-05-26 13:10:15

标签: mongodb mongodb-query aggregation-framework

我试图在我的MongoDB中获取键的所有不同值的计数。我也得到了计数,但是我得到了2个不同的对象。

{ "_id" : ObjectId("596f6e95b6a1aa8d363befeb"), produce:"potato","variety" : "abc", "state" : 'PA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befec"), produce:"potato", "variety" : "abc", "state" : 'PA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befed"), produce:"potato", "variety" : "def", "state" : 'IA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befee"), produce:"potato", "variety" : "def", "state" : 'IA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befef"), produce:"potato", "variety" : "abc", "state" : 'DA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befeg"), produce:"potato", "variety" : "abc", "state" : 'DA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befeh"), produce:"potato", "variety" : "def", "state" : 'DA' }

{ "_id" : ObjectId("596f6e95b6a1aa8d363befei"), produce:"potato", "variety" : "abc", "state" : 'IA' }

db.aggregate([


    {
       $match:{produce: "potato"}
    },
    {
       "$group":{
          "_id":{"variety":"$variety","state":"$state"},
          "count":{"$sum":1}
        }    
    },
    {
       "$group":{
           "_id":null,
                "counts":{
                    "$push": {"filterkey":"$_id.variety","state":"$_id.state","count":"$count"}
                }
         }
     },
])

实际结果:- 计数

[

    { filterkey: 'abc', state: 'PA', count: 2},
    { filterkey: 'abc', state: 'IA', count: 1},
    { filterkey: 'abc', state: 'DA', count: 2},
    { filterkey: 'def', state: 'IA', count: 2},
    { filterkey: 'def', state: 'DA', count: 1}
]

预期结果:- 计数

[

    { filterkey: 'abc', states:{'PA':2,'IA':1,'DA':2},
    { filterkey: 'def', states:{'IA':2,'DA':1}
]

是否可以通过某种方式获取数据?

1 个答案:

答案 0 :(得分:1)

您需要在此处使用多级$group。首先,您需要将$groupvarietystate字段一起使用,并且需要$sum来获取每个variety和{{1} }。

然后您需要将$groupstate一起使用,以获取每个variety的唯一文档数。

最后$arrayToObject展平variety数组。

states

您可以here逐个删除阶段,并查看实际发生的情况。

输出

db.collection.aggregate([
  { "$match": { "produce": "potato" }},
  { "$group": {
    "_id": { "variety": "$variety", "state": "$state" },
    "count": { "$sum": 1 }
  }},
  { "$group": {
    "_id": "$_id.variety",
    "states": {
      "$push": {
        "k": "$_id.state",
        "v": "$count"
      }
    }
  }},
  { "$addFields": {
    "states": {
      "$arrayToObject": "$states"
    }
  }}
])