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

bq3bfh9z  于 2023-04-29  发布在  Go
关注(0)|答案(1)|浏览(181)

我有一个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
  }
}

其易于写入错误。
有没有一些更聪明的方法来做到这一点,而不显式地在组阶段包含所有属性?
先谢谢你了!

ezykj2lf

ezykj2lf1#

根据您的示例数据,它可能是这样的:

db.collection.aggregate([
   {
      $set: {
         a: {
            $map: {
               input: "$a",
               in: {
                  $mergeObjects: [
                     "$$this",
                     { aa: { $concat: ["prefix-", "$$this.aa", "-suffix"] } }
                  ]
               }
            }
         }
      }
   }
])

相关问题