Mongodb,而聚合组值作为键

时间:2019-09-01 15:07:52

标签: mongodb aggregation-framework

我试图对值进行汇总和分组,但希望将字段之一作为键。

[
  {id:1, value: "x"},
  {id:2, value: "y"},
  {id:1, value: "a"},
  {id:2, value: "b"},
]

使用了此查询,但没有运气

db.getCollection('Test').aggregate([
    {
        $group: {
            _id: "$id",
            "value": {$push: "$$ROOT" }
        } 
    }
])

正在尝试实现

[
 { 1:[x,a] },
 { 2:[y,b] }
]

有人可以帮助我进行此查询吗?

1 个答案:

答案 0 :(得分:1)

您需要运行两次$group才能获得包含k,v对数组的单个文档。然后,您可以与$arrayToObject一起在该文档上运行$replaceRoot,以将新对象提升到根级别:

db.collection.aggregate([
    {
        $group: {
            _id: "$id",
            values: { $push: "$value" }
        }
    },
    {
        $group: {
            _id: null,
            root: { $push: { k: { $toString: "$_id" }, v: "$values" } }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: "$root"
            }
        }
    }
])

Mongo Playground