【问题标题】:How to group data by key without $unwind nor $group stage in mongodb aggregationmongodb聚合中如何在没有$unwind或$group阶段的情况下按键对数据进行分组
【发布时间】:2022-02-08 11:12:20
【问题描述】:

谁能帮我在不使用 $unwind 或 $group stage 的情况下按key 对数据进行分组?我不想使用 $unwind 或 $group 阶段的原因是因为我希望能够在 updateMany(filter, pipeline) 操作中使用管道,所以我可以使用的阶段仅限于:$addFields (= $set) , $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 聚合的新手,所以我很难有条件地在数组中累积对象。

谢谢

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:
        [
            {
                $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

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 2013-08-24
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多