首页 > 解决方案 > Mongo 在 $group 阶段添加新的键值对

问题描述

我有一系列文件,例如:

{
 "tagName": "Tag1",
 "value": 1,
 "ts": "2020/01/01 20:00"
},

{
 "tagName": "Tag2",
 "value": 2,
 "ts": "2020/01/01 20:00"
},

{
 "tagName": "Tag3",
 "value": 3,
 "ts": "2020/02/01 20:00"
}

我想对文档进行分组并对tsand 进行字典tagNamevalue。所以意图输出是:

[

 {
  "Tag1": 1
  "Tag2": 2,
  "ts": "2020/01/01 20:00"
 },
 
 {
  "Tag3": 3,
  "ts": "2020/02/01 20:00"
 }

]

我尝试了以下管道:

  {
    $group: {
      '_id': '$ts',
      'output': {
        $push: {
          '$t': '$v'
        }
      }
    }
  }

谢谢你的帮助!

标签: mongodbmongodb-queryaggregation-framework

解决方案


$groupby时ts,您应该将tagNameand添加value到一个数组 -> 将其转换回tagName: valueby$arrayToObject然后将其合并回 root 以获得您的预期结果。

操场

db.collection.aggregate([
  {
    $group: {
      _id: "$ts",
      "tags": {
        "$push": {
          "k": "$tagName",
          "v": "$value"
        }
      }
    }
  },
  {
    $project: {
      "ts": "$_id",
      "tagsObj": {
        "$arrayToObject": "$tags"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {
            _id: "$_id",
            
          },
          "$tagsObj"
        ]
      }
    }
  }
])

推荐阅读