mongodb 聚合中如何在没有 $unwind 或 $group 阶段的情况下按键对数据进行分组
How to group data by key without $unwind nor $group stage in mongodb aggregation
任何人都可以帮助我按 key
分组数据而不使用 $unwind 或 $group stage 吗?我不想使用 $unwind 和 $group 阶段的原因是因为我希望能够在 updateMany(filter, pipeline)
操作中使用管道,所以我可以使用的阶段仅限于: $addFields (= $设置)、$project (= $unset) 和 $replaceRoot (= $replaceWith).
输入数据如下所示:
[
{
key: "alpha",
value: {
name: "foo",
},
},
{
key: "beta",
value: {
name: "bar",
},
},
{
key: "alpha",
value: {
name: "baz",
},
},
]
我想得到的结果:
[
{
key: "alpha",
values: [
{
name: "foo",
},
{
name: "baz",
},
],
},
{
key: "beta",
values: [
{
name: "bar",
},
],
},
]
我相信使用 $reduce 是可行的,但我是 mongodb 聚合的新手,所以我很难有条件地在数组中累积对象。
谢谢
[
{
$set: {
keys: { $setUnion: [ "$array.key" ] }
}
},
{
$set: {
newarray : {
$map : {
input : "$keys",
in : {
key : "$$this",
values : {
$map : {
input : {
$filter : {
input : "$array",
as : "elem",
cond : {
$eq : [
"$$elem.key",
"$$this"
]
}
}},
as : "vals",
in : {
name : "$$vals.value.name"
}
}
}
}
}
}
}
}
]
试试吧。 https://mongoplayground.net/p/m1UUvt5QNgg
或者更紧凑的版本:https://mongoplayground.net/p/bFrSiyc5nSc
任何人都可以帮助我按 key
分组数据而不使用 $unwind 或 $group stage 吗?我不想使用 $unwind 和 $group 阶段的原因是因为我希望能够在 updateMany(filter, pipeline)
操作中使用管道,所以我可以使用的阶段仅限于: $addFields (= $设置)、$project (= $unset) 和 $replaceRoot (= $replaceWith).
输入数据如下所示:
[
{
key: "alpha",
value: {
name: "foo",
},
},
{
key: "beta",
value: {
name: "bar",
},
},
{
key: "alpha",
value: {
name: "baz",
},
},
]
我想得到的结果:
[
{
key: "alpha",
values: [
{
name: "foo",
},
{
name: "baz",
},
],
},
{
key: "beta",
values: [
{
name: "bar",
},
],
},
]
我相信使用 $reduce 是可行的,但我是 mongodb 聚合的新手,所以我很难有条件地在数组中累积对象。
谢谢
[
{
$set: {
keys: { $setUnion: [ "$array.key" ] }
}
},
{
$set: {
newarray : {
$map : {
input : "$keys",
in : {
key : "$$this",
values : {
$map : {
input : {
$filter : {
input : "$array",
as : "elem",
cond : {
$eq : [
"$$elem.key",
"$$this"
]
}
}},
as : "vals",
in : {
name : "$$vals.value.name"
}
}
}
}
}
}
}
}
]
试试吧。 https://mongoplayground.net/p/m1UUvt5QNgg 或者更紧凑的版本:https://mongoplayground.net/p/bFrSiyc5nSc