猫鼬用数组中的另一个值更新数组字段

时间:2020-10-27 06:49:06

标签: mongoose

考虑一下我们有如下文件:

{
   "_id" : 1,
   "books" : [
      { "a" : 80, "b" : 75 },
      { "a" : 85, "b" : 100 },
      { "a" : 85, "b" : 100 }
   ]
}
{
   "_id" : 2,
   "books" : [
      { "a" : 90, "b" : 95 },
      { "a" : 95, "b" : 200 },
      { "a" : 85, "b" : 200 }
   ]
}

我希望查询将books数组中的每个元素的所有“ a”值替换为“ b”值。

我尝试了以下查询:

db.test.updateMany({}, {$set: {"books.$[].a": "$books.$.b"}}, {multi: true, upsert: true})

但是它正在为所有“ a”值而不是“ b”值设置$books.$.b的文字字符串。 你能告诉我我在做什么错吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试update with aggregation pipeline从MongoDB 4.2开始,

  • $map迭代books数组的循环并在更改中进行更新以更新值a并使用$mergeObjects将对象与当前对象合并
db.test.updateMany({},
  [{
    $set: {
      books: {
        $map: {
          input: "$books",
          in: {
            $mergeObjects: ["$$this", { a: "$$this.b" }]
          }
        }
      }
    }
  }]
)

Playground

确保您的mongo shell版本大于4.2