mongodb 相对于所有阵列子对象自身的当前值更新它们

uinbv5nw  于 2023-01-16  发布在  Go
关注(0)|答案(1)|浏览(83)

假设我想将所有嵌套值乘以10。

{
  foos: [
    { val: 1 },
    { val: 10 },
    { val: 5 },
  ]
}
// to
{
  foos: [
    { val: 10 },
    { val: 100 },
    { val: 50 },
  ]
}

由于我们重用了现有的字段值,所以我假设必须使用聚合操作符。
以下是一些尝试:
x一个一个一个一个x一个一个二个x
不提取文档并继续使用JS循环进行更新是否可行?
比如:

coll.updateMany({}, [
  {
    $set: {
      foos: {
        $map: {
          input: '$foos',
          as: 'foo',
          in: {
            $project: {
              blackMagicToSpreadtheOriginalFoo: '$$foo', // FIXME
              val: { $multiply: ['$$foo.val', 10] }
            }
          }
        }
      }
    }
  }
])
cigdeys3

cigdeys31#

在这种情况下,您为什么需要:blackMagicToSpreadtheOriginalFoo: '$$foo', // FIXME?为什么不简单地:

coll.updateMany({},
[
  {
    $set: {
      foos: {
        $map: {
          input: "$foos",
          in: {val: {$multiply: ["$$this.val", 10]}}
        }
      }
    }
  }
])

了解它在playground example上的工作原理
如果 eclipse 刻项中有其他键,则使用$mergeObjects

coll.updateMany({},
[
  {
    $set: {
      foos: {
        $map: {
          input: "$foos",
          in: {
            $mergeObjects: [
              "$$this",
              {val: {$multiply: ["$$this.val", 10]}}
            ]
          }
        }
      }
    }
  }
])

了解它在playground example - with keys上的工作原理

相关问题