MongoDB聚合 - 将字段值作为字段投影

6

我遇到了将数据转换为特定格式的问题。

这些文档包含以下字段:主题(subject)、重要性(high, medium, low)

样例文档:

{_id: "", subject: "red", importance: "high"}

我希望返回类似于以下格式的数据:

[{_id: subject, high: 5, medium: 6, low: 3}] 

这些数字对应每个重要程度的文档数量。
目前为止,我有以下内容:
{
$group: {
  _id: {subject: "$subject", importance: "$importance"},
  count: {$sum: 1},
  }
 },
 {
   $group: {
     _id: "$_id.subject",
     data: {
       $push: {
          importance: "$_id.importance", count: "$count"
       }
     }
   }
 }

有没有一种方法可以使用$_id.importance的值作为键,并将$count作为值?

请问您能否发布一个样例文档? - BatScream
文档的格式如下:{_id: "", subject: "red", importance: "high"}。 - GJL12
1个回答

2
您可以按如下方式聚合:
  • $groupsubjectimportance 聚合,并获取相应的计数。
  • 然后是棘手的部分,有条件的$project,它将随着 importance 字段可能包含的选项数量呈线性增长。目前有三个选项 - highlowmedium
  • 再次使用 $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 }

2
如果“importance”将包含约20个字段,我该怎么做?@batscream - Shaishab Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接