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