我试图对值进行汇总和分组,但希望将字段之一作为键。
[
{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] }
]
有人可以帮助我进行此查询吗?
答案 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"
}
}
}
])