您可以按如下方式聚合:
$group
按 subject
和 importance
聚合,并获取相应的计数。
- 然后是棘手的部分,有条件的
$project
,它将随着 importance
字段可能包含的选项数量呈线性增长。目前有三个选项 - high
、low
和 medium
。
- 再次使用
$group
操作符按 subject
进行聚合,并使用 $sum
操作符对不同重要性字段的计数进行累加。
示例代码:
db.t.aggregate([
{$group:{"_id":{"subject":"$subject",
"importance":"$importance"},
"count":{$sum:1}}},
{$project:{"_id":0,
"subject":"$_id.subject",
"result":{$cond:[
{$eq:["$_id.importance","high"]},
{"high":"$count"},
{$cond:[{$eq:["$_id.importance","low"]},
{"low":"$count"},
{"medium":"$count"}]}]}}},
{$group:{"_id":"$subject",
"low":{$sum:"$result.low"},
"medium":{$sum:"$result.medium"},
"high":{$sum:"$result.high"}}},
])
测试数据:
db.t.insert([
{"subject":"history","importance":"high"},
{"subject":"geography","importance":"low"},
{"subject":"history","importance":"low"},
{"subject":"history","importance":"medium"},
{"subject":"geography","importance":"low"},
{"subject":"history","importance":"low"}
])
结果:
{ "_id" : "geography", "low" : 2, "medium" : 0, "high" : 0 }
{ "_id" : "history", "low" : 2, "medium" : 1, "high" : 1 }