聚合管道可以用来更新数据库中的文档吗?

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

我写了这个聚合管道。我想更新此管道中匹配的文档并根据阶段进行更新。我假设 $replaceRoot 会做到这一点。我是否错了。我只是想知道聚合管道是否可以更新文档。如果是的话,这是最佳实践还是黑客。而且我不想使用 $out 运算符。

[
  { $match: { name: "awss3-metadata-loader" } },
  {
    $set: {
      tags: {
        $cond: {
          if: {
            $in: [{ $type: "$tags" }, ["null"]],
          },
          then: [
            {
              k: "awss3metadataloader",
              v: "new",
            },
          ],
          else: {},
        },
      },
    },
  },
  { $replaceRoot: { newRoot: "$$ROOT" } },
]```

mongodb aggregation-framework
1个回答
0
投票

是的,这是可能的。您可以使用

db.collection.updateMany({<filter>}, [<pipeline>])
db.collection.updateOne()

会是

db.collection.updateMany(
  {name: "awss3-metadata-loader"},
  [
  {
    $set: {
      tags: {
        $cond: {
          if: {
            $in: [{ $type: "$tags" }, ["null"]],
          },
          then: [
            {
              k: "awss3metadataloader",
              v: "new",
            },
          ],
          else: {},
        },
      },
    },
  },
  { $replaceRoot: { newRoot: "$$ROOT" } },
])

注意,管道必须仅包含以下聚合阶段:

  • $addFields
    及其别名
    $set

  • $project
    及其别名
    $unset

  • $replaceRoot
    及其别名
    $replaceWith

您的示例就是这种情况。

请参阅 使用聚合管道进行更新

© www.soinside.com 2019 - 2024. All rights reserved.