使用mongodb的多级$group

使用mongodb的多级$group,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试获取MongoDB中一个键的所有不同值的计数。我也得到了计数,但是我得到了两个不同的对象 { "_id" : ObjectId("596f6e95b6a1aa8d363befeb"), produce:"potato","variety" : "abc", "state" : 'PA' } { "_id" : ObjectId("596f6e95b6a1aa8d363befec"), produce:"potato", "variety" : "abc", "state" : 'PA

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

{ "_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"}
                }
         }
     },
])
实际结果:- 计数

预期结果:- 计数


有什么方法可以获得这样的数据吗?

您需要在这里使用多级数据挖掘。首先,您需要与
变体
状态
字段一起使用,并且需要
$sum
来获取每个
变体
状态
的唯一文档总数

然后,您需要使用
变体
,以获得每个
变体
的唯一文档数

最后是展平
状态
数组

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"
    }
  }}
])
您可以一个一个地删除阶段,并可以看到实际发生的情况

输出

[
  {
    "_id": "def",
    "states": {
      "DA": 1,
      "IA": 2
    }
  },
  {
    "_id": "abc",
    "states": {
      "DA": 2,
      "IA": 1,
      "PA": 2
    }
  }
]

你能从技术上解释一下这个输出是如何产生的吗?@swetasharma更新了我的答案。
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"
    }
  }}
])
[
  {
    "_id": "def",
    "states": {
      "DA": 1,
      "IA": 2
    }
  },
  {
    "_id": "abc",
    "states": {
      "DA": 2,
      "IA": 1,
      "PA": 2
    }
  }
]