MongoDB 聚合管道以智能方式修改数组中的对象

问题描述 投票:0回答:0

我有一个 MongoDB 集合,其中文档有一个对象数组。像这样:

{
  _id: ...,
  a: [
    {
      aa: "foo1"
      bb: "bar1"
    },
    {
      aa: "foo2"
      bb: "bar2"
    },
    {
      aa: "foo3"
      bb: "bar3"
    }
    ...
  ],
  b: ...
}

我想修改对象的一些字段,其余部分保持不变。我正在为此使用聚合框架,分三个阶段:展开数组,修改对象(现在在文档的根级别),最后按

_id
重新分组以取回数组。

{
  $unwind: "a"
},
{
  $set: {"a.aa": {$concat: ["prefix-", "$a.aa", "-suffix"]}}
},
{
  $group: {
    _id: "$_id",
    a: {$push: "$a"},
    b: {$first: "$b"}
  }
}

到目前为止一切顺利。

问题是我除了数组之外没有只有一个字段。我有很多(~10)所以小组赛实际上是这样的:

{
  $group: {
    _id: "$_id",
    a: {$push: "$a"},
    b: {$first: "$b"},
    c: {$first: "$c"},
    d: {$first: "$d"},
    // a lot of fields here
  }
}

写起来容易出错

是否有一些更聪明的方法可以做到这一点,而无需在小组赛阶段明确包含所有属性?

提前致谢!

mongodb aggregation-framework
© www.soinside.com 2019 - 2024. All rights reserved.