Mongodb 阵列上具有内部组/计数的mongo聚合组
我对当前的聚合表达式感到困惑和困惑,我希望Mongo本身能提供一些输入或解决方案 来自Mongo的原始数据(简化为我现在需要的字段): 总的来说,大约有8个“CIC包”的1000条记录,具有不同的状态(已确认、已取消、暂定、已完成)以及我目前排除的其他数据 我期待的最终结果是这样的: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" : [ {
[{
"_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”:“设计思维研讨会”,
“包装”:“设计思维研讨会”,
“地位”:[
“取消”,
“取消”,