我写了这个聚合管道.我想要更新在这个管道中匹配的文档,并按阶段进行更新.我假设$replaceRoot会这样做.我是不是错了?我只是想知道聚合管道是否可以更新文档.如果是,这是一种最佳实践还是一种黑客行为.而且我不想使用$out运算符.

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

推荐答案

是的,这是可能的.你可以用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

在您的示例中就是这种情况.

Update with an Aggregation Pipeline

或者你可以使用$merge的接线员.

Mongodb相关问答推荐

如何在MongoDB中通过限制和跳过查找项进行匹配

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

MongoDb 聚合未正确分组

在 MongoDB 中使用 findOneAndUpdate 有条件地更新/更新嵌入式数组

在mongodb中,如何使用聚合来获取字段之间的对应关系

findOneAndUpdate 和 findOneAndReplace 有什么区别?

在mongo聚合中将ObjectID转换为字符串

MongoDB:设置 Windows 服务

Java MongoDB/BSON 类混淆

为 php 5.6 (XAMPP) 添加 mongodb 扩展

ExpressJS & Mongoose REST API struct :最佳实践?

从 LinkedHashMap 转换为 Json 字符串

如何在mongodb中删除数组的第n个元素

用于嵌入式集合的 MongoDB 首选模式.文档与数组

在安装的 MongoDB homebrew 中设置 dbpath (Mac OS)

在 MongoDB 上分片 GridFS

在 Mongo 中,$near 和 $nearSphere 有什么区别?

mongoose:按字母顺序排序

如何使用 mgo 从 golang 中的 mongodb 集合中 Select 所有记录

在 MongoDB 中比较日期(moment.js)