Mongodb 阵列上具有内部组/计数的mongo聚合组

Mongodb 阵列上具有内部组/计数的mongo聚合组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我对当前的聚合表达式感到困惑和困惑,我希望Mongo本身能提供一些输入或解决方案 来自Mongo的原始数据(简化为我现在需要的字段): 总的来说,大约有8个“CIC包”的1000条记录,具有不同的状态(已确认、已取消、暂定、已完成)以及我目前排除的其他数据 我期待的最终结果是这样的: [{ "_id" : "Test Gallery Café", "package" : "Test Gallery Café", "status" : [ {

我对当前的聚合表达式感到困惑和困惑,我希望Mongo本身能提供一些输入或解决方案

来自Mongo的原始数据(简化为我现在需要的字段):

总的来说,大约有8个“CIC包”的1000条记录,具有不同的状态(已确认、已取消、暂定、已完成)以及我目前排除的其他数据

我期待的最终结果是这样的:

    [{
    "_id" : "Test Gallery Café",
    "package" : "Test Gallery Café",
    "status" : [
      {
        "Cancelled": 1
      },
      {
        "Completed": 1
      }
    ]
  },
  {
    "_id" : "Design Thinking workshop",
    "package" : "Design Thinking workshop",
    "status" : [
      {
        "Cancelled": 3
      },
      {
        "Completed": 2
      }
    ]
  },
  {
    "_id" : "Product / solution demonstration",
    "package" : "Product / solution demonstration",
    "status" : [
      {

        "Completed": 10
      },
      {
        "Cancelled": 3
      },
      {
        "Confirmed": 1
      }
    ]
  }]
[
      {
        "_id" : "Studio Canal",
        "package" : "Studio Canal",
        "status" : [
          {
            "status" : "Completed",
            "count" : 8
          },
          {
            "status" : "Cancelled",
            "count" : 2
          }
        ]
      },
      {
        "_id" : "Meeting / forum",
        "package" : "Meeting / forum",
        "status" : [
          {
            "status" : "Cancelled",
            "count" : 254
          },
          {
            "status" : "Completed",
            "count" : 275
          },
          {
            "status" : "Processing",
            "count" : 6
          },
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Confirmed",
            "count" : 6
          }
        ]
      },
      {
        "_id" : "Design Thinking workshop",
        "package" : "Design Thinking workshop",
        "status" : [
          {
            "status" : "Cancelled",
            "count" : 2
          }
        ]
      },
      {
        "_id" : "Test Gallery Café",
        "package" : "Test Gallery Café",
        "status" : [
          {
            "status" : "Cancelled",
            "count" : 1
          },
          {
            "status" : "Completed",
            "count" : 1
          }
        ]
      },
      {
        "_id" : "Not specified",
        "package" : "Not specified",
        "status" : [
          {
            "status" : "Completed",
            "count" : 124
          },
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Cancelled",
            "count" : 42
          },
          {
            "status" : "Confirmed",
            "count" : 4
          },
          {
            "status" : "Processing",
            "count" : 5
          }
        ]
      },
      {
        "_id" : "Customer / partner / special event",
        "package" : "Customer / partner / special event",
        "status" : [
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Cancelled",
            "count" : 145
          },
          {
            "status" : "Processing",
            "count" : 3
          },
          {
            "status" : "Completed",
            "count" : 284
          },
          {
            "status" : "Confirmed",
            "count" : 8
          }
        ]
      },
      {
        "_id" : "Product / solution demonstration",
        "package" : "Product / solution demonstration",
        "status" : [
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Confirmed",
            "count" : 4
          },
          {
            "status" : "Cancelled",
            "count" : 82
          },
          {
            "status" : "Completed",
            "count" : 130
          },
          {
            "status" : "Processing",
            "count" : 1
          }
        ]
      }
    ]
因此,根据我在
$group
中重命名为
package
CIC包
,我想对数据集中存在的每个状态进行计数。状态和包不在我的控制之下,因此可以及时添加新的状态和包。它需要是一个充满活力的群体

我做到了这一点:

  db.reportData.aggregate([
  {
    $project: 
    {
      'CIC package': 1,
      'Status': 1
    }
   }
 , 
   {
     $group: 
     {
       _id: '$CIC package',
       package: 
       {
         $first: '$CIC package'
       }
     ,
       status:
       {
         $push: '$Status'
       }
     }
   }
 ]).toArray()
这就产生了这样的结果:

  [{
    "_id" : "Test Gallery Café",
    "package" : "Test Gallery Café",
    "status" : [
      "Cancelled",
      "Completed"
    ]
  },
  {
    "_id" : "Design Thinking workshop",
    "package" : "Design Thinking workshop",
    "status" : [
      "Cancelled",
      "Cancelled",
      "Cancelled",
      "Completed",
      "Completed"
    ]
  },
  {
    "_id" : "Product / solution demonstration",
    "package" : "Product / solution demonstration",
    "status" : [
      "Completed",
      "Completed",
      "Cancelled",
      "Processing",
      "Cancelled",
      "Cancelled",
      "Completed",
      "Completed",
      "Completed",
      "Completed",
      "Completed",
      "Completed",
      "Completed",
      "Completed",
      "Completed",
      "Tentative"
    ]
  }]
这是一个大得多的集合中的一个小抽取,但到目前为止,它是一个很好的结果样本

在最后一次
分组
之后,我尝试了
放松
,这确实创建了新的记录,我可能会再次
分组
,但我现在有点困惑。也许我做这件事效率很低。 我想我就快到了,但我希望你能给我一些建议


有什么想法吗?

您基本上希望每种类型的“状态计数”,这是一个先分组以计数,然后仅按对象的主要
\u id
进行分组的问题:

db.reportData.aggregate([
{“$unwind”:“$status”},
{“$组”:{
“_id”:{
“\u id”:“$\u id”,
“套餐”:“$package”,
“状态”:“$status”
},
“计数”:{“$sum”:1}
}},
{“$组”:{
“\u id”:“$\u id.\u id”,
“包”:{“$first”:“$\u id.package”},
“地位”:{
“$push”:{
“$cond”:[
{“$eq”:[“$_id.status”,“Completed”]},
{“已完成”:“$count”},
{“$cond”:[
{“$eq”:[“$_id.status”,“Cancelled”]},
{“已取消”:“$count”},
{“$cond”:[
{“$eq”:[“$\u id.status”,“Processing”]},
{“处理”:“$count”},
{“暂定”:“$count”}
]}
]}
]
}
}
}}
])
或者在结果中为每个状态保留一个“类型”字段,使其保持通用性:

db.reportData.aggregate([
{“$unwind”:“$status”},
{“$组”:{
“_id”:{
“\u id”:“$\u id”,
“套餐”:“$package”,
“状态”:“$status”
},
“计数”:{“$sum”:1}
}},
{“$组”:{
“\u id”:“$\u id.\u id”,
“包”:{“$first”:“$\u id.package”},
“地位”:{
“$push”:{
“类型”:“$\u id.status”,
“计数”:“$count”
}
}
}}
])
这将为您提供如下结果:

    [{
    "_id" : "Test Gallery Café",
    "package" : "Test Gallery Café",
    "status" : [
      {
        "Cancelled": 1
      },
      {
        "Completed": 1
      }
    ]
  },
  {
    "_id" : "Design Thinking workshop",
    "package" : "Design Thinking workshop",
    "status" : [
      {
        "Cancelled": 3
      },
      {
        "Completed": 2
      }
    ]
  },
  {
    "_id" : "Product / solution demonstration",
    "package" : "Product / solution demonstration",
    "status" : [
      {

        "Completed": 10
      },
      {
        "Cancelled": 3
      },
      {
        "Confirmed": 1
      }
    ]
  }]
[
      {
        "_id" : "Studio Canal",
        "package" : "Studio Canal",
        "status" : [
          {
            "status" : "Completed",
            "count" : 8
          },
          {
            "status" : "Cancelled",
            "count" : 2
          }
        ]
      },
      {
        "_id" : "Meeting / forum",
        "package" : "Meeting / forum",
        "status" : [
          {
            "status" : "Cancelled",
            "count" : 254
          },
          {
            "status" : "Completed",
            "count" : 275
          },
          {
            "status" : "Processing",
            "count" : 6
          },
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Confirmed",
            "count" : 6
          }
        ]
      },
      {
        "_id" : "Design Thinking workshop",
        "package" : "Design Thinking workshop",
        "status" : [
          {
            "status" : "Cancelled",
            "count" : 2
          }
        ]
      },
      {
        "_id" : "Test Gallery Café",
        "package" : "Test Gallery Café",
        "status" : [
          {
            "status" : "Cancelled",
            "count" : 1
          },
          {
            "status" : "Completed",
            "count" : 1
          }
        ]
      },
      {
        "_id" : "Not specified",
        "package" : "Not specified",
        "status" : [
          {
            "status" : "Completed",
            "count" : 124
          },
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Cancelled",
            "count" : 42
          },
          {
            "status" : "Confirmed",
            "count" : 4
          },
          {
            "status" : "Processing",
            "count" : 5
          }
        ]
      },
      {
        "_id" : "Customer / partner / special event",
        "package" : "Customer / partner / special event",
        "status" : [
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Cancelled",
            "count" : 145
          },
          {
            "status" : "Processing",
            "count" : 3
          },
          {
            "status" : "Completed",
            "count" : 284
          },
          {
            "status" : "Confirmed",
            "count" : 8
          }
        ]
      },
      {
        "_id" : "Product / solution demonstration",
        "package" : "Product / solution demonstration",
        "status" : [
          {
            "status" : "Tentative",
            "count" : 1
          },
          {
            "status" : "Confirmed",
            "count" : 4
          },
          {
            "status" : "Cancelled",
            "count" : 82
          },
          {
            "status" : "Completed",
            "count" : 130
          },
          {
            "status" : "Processing",
            "count" : 1
          }
        ]
      }
    ]
{
“_id”:“测试画廊咖啡馆”,
“套餐”:“测试画廊咖啡馆”,
“地位”:[
{
“类型”:“已完成”,
“计数”:1
},
{
“类型”:“已取消”,
“计数”:1
}
]
}
{
“_id”:“设计思维研讨会”,
“包装”:“设计思维研讨会”,
“地位”:[
{
“类型”:“已完成”,
“计数”:2
},
{
“类型”:“已取消”,
“计数”:3
}
]
}
{
“_id”:“未指定”,
“包”:“未指定”,
“地位”:[
{
“类型”:“处理”,
“计数”:1
},
{
“类型”:“暂定”,
“计数”:1
},
{
“类型”:“已取消”,
“计数”:3
},
{
“类型”:“已完成”,
“计数”:11
}
]
}

在未来版本的MongoDB中,使用
$filter
,这会更好一些:

db.reportData.aggregate([
{“$project”:{
“一揽子计划”:1,
“状态完成”:{
“$size”:{
“$filter”:{
“输入”:“$status”,
“as”:“el”,
“条件”:{
“$eq”:[“$$el”,“已完成”]
}
}
}
},
“状态已取消”:{
“$size”:{
“$filter”:{
“输入”:“$status”,
“as”:“el”,
“条件”:{
“$eq”:[“$$el”,“已取消”]
}
}
}
}
}}
])
因为它基本上是关于“计算数组中匹配的元素”,最后一个可以扩展到实际生成与前一个相同的数组结果,由于没有
$unwind
,因此开销要小得多。当然这还没有发布,但这只是你将来能做什么的一个样本

同样为了记录在案,变更前原稿中提供的数据如下:

{
“_id”:“测试画廊咖啡馆”,
“套餐”:“测试画廊咖啡馆”,
“地位”:[
“取消”,
“已完成”
]
}
{
“_id”:“设计思维研讨会”,
“包装”:“设计思维研讨会”,
“地位”:[
“取消”,
“取消”,