Mongoose使用数组中的另一个值更新数组字段

Mongoose使用数组中的另一个值更新数组字段,mongoose,Mongoose,考虑到我们有如下文件: { "_id" : 1, "books" : [ { "a" : 80, "b" : 75 }, { "a" : 85, "b" : 100 }, { "a" : 85, "b" : 100 } ] } { "_id" : 2,

考虑到我们有如下文件:

{
   "_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
的文本字符串。 你能告诉我我做错了什么吗?

你可以试着启动rom MongoDB 4.2

  • $map
    迭代
    书籍
    数组循环和内部更改更新值
    a
    ,并使用
    $mergeObjects
    将对象与当前对象合并

确保您的mongo shell版本大于4.2

您可以尝试启动rom MongoDB 4.2

  • $map
    迭代
    书籍
    数组循环和内部更改更新值
    a
    ,并使用
    $mergeObjects
    将对象与当前对象合并

确保您的mongo shell版本大于4.2


这给了我错误。我用第二个参数对象代替数组,错误消失了,但结果是空的books数组。你能显示你得到的错误吗?这是mongodb 4.2提供的支持,而且由于mongo shell的旧版本,robo mongo将不支持这一点。这给了我一个错误。我用第二个参数对象代替数组,错误消失了,但结果是空的books数组。你能显示你得到的错误吗?这是mongodb 4.2提供的支持,而且由于mongo shell的旧版本,robo mongo将不支持这一点。
db.test.updateMany({},
  [{
    $set: {
      books: {
        $map: {
          input: "$books",
          in: {
            $mergeObjects: ["$$this", { a: "$$this.b" }]
          }
        }
      }
    }
  }]
)