对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

事务和操作

MongoDB 提供了跨多个操作、集合、数据库、文档和分片使用事务的能力。

允许在事务中执行以下读/写操作:

方法
命令
注意

不包括以下查询运算符表达式:

该方法使用 $match 聚合阶段进行查询,使用 $group 聚合阶段和 $sum 表达式来执行计数。

可用于未分片的集合。

对于分片集合,请使用带有 $group 阶段的聚合管道。请参阅去重操作

如果使用 upsert: true 在不存在的集合上运行更新或替换操作,则会隐式创建该集合。

For more details, see Administration Operations.

如果在不存在的集合上运行,则会隐式创建该集合。

For more details, see Administration Operations.

如果在不存在的集合上运行,则会隐式创建该集合。

For more details, see Administration Operations.

如果在不存在的集合上运行,则会隐式创建该集合。

For more details, see Administration Operations.

注意

分片键值的更新

您可以通过在事务中或作为可重试写入发出单个文档 update/findAndModify 操作来更新文档的分片键值(除非分片键字段是不可变的 _id 字段)。有关详细信息,请参阅更改文档的分片键值。

要在事务内执行计数操作,请使用 $count 聚合阶段或 $group(带有 $sum 表达式)聚合阶段。

MongoDB 驱动程序提供集合级 API countDocuments(filter, options) 作为辅助方法,该方法使用 $group$sum 表达式来执行计数。

mongosh provides the db.collection.countDocuments() helper method that uses the $group with a $sum expression to perform a count.

如要在事务中执行不同的操作:

  • 对于未分片的集合,可以使用 db.collection.distinct() 方法/distinct 命令以及带有 $group 阶段的聚合管道。

  • 对于分片集合,不能使用 db.collection.distinct() 方法或 distinct 命令。

    要查找分片集合的不同值,请改用带有 $group 阶段的 aggregation pipeline。例如:

    • 不使用 db.coll.distinct("x"),而是使用

      db.coll.aggregate([
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])
    • 不使用 db.coll.distinct("x", { status: "A" }),而是使用

      db.coll.aggregate([
      { $match: { status: "A" } },
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])

    管道返回一个指向文档的游标:

    { "distinctValues" : [ 2, 3, 1 ] }

    迭代游标以访问结果文档。

您可以在事务中创建集合和索引。有关详细信息,请参阅在事务中创建集合和索引。ACID 事务中使用的集合可以位于不同的数据库中。

注意

您无法在跨分片写事务中创建新集合。例如,如果您在一个分片中写入一个现有集合,并在另一个分片中隐式创建一个集合,MongoDB 将无法在同一事务中执行这两个操作。

如果分布式事务不是跨分片写入事务,则可以在该事务中创建集合和索引。

命令
方法
注意

另请参阅隐式创建操作

要创建的索引必须位于不存在的集合上(在这种情况下,该集合是作为操作的一部分创建的),或者位于先前在同一事务中新创建的空集合上。

注意

要在事务内显式创建集合或索引,事务读关注级别必须为 "local"

有关在事务中创建集合和索引的更多信息,请参阅在事务中创建集合和索引

您还可以通过以下针对不存在的集合的写操作隐式创建集合:

针对不存在的集合的运行方法
针对非现有集合运行命令

findAndModify 通过 upsert: true

update 通过 upsert: true

带插入或 upsert:true 操作的 db.collection.bulkWrite()
带插入或 upsert:true 操作的各种 批量操作

有关事务中允许的其他 CRUD 操作,请参阅 CRUD 操作

有关在事务中创建集合和索引的更多信息,请参阅在事务中创建集合和索引

事务中允许使用诸如 hellobuildInfoconnectionStatus(及其辅助方法)之类的信息命令,但它们不能是事务中的第一项操作。

事务中不允许执行以下操作:

  • 在跨分片写事务中创建新集合。例如,如果您在一个分片中写入一个现有集合,并在另一个分片中隐式创建一个集合,那么 MongoDB 将无法在同一事务中执行这两项操作。

  • Explicit creation of collections, e.g. db.createCollection() method, and indexes, e.g. db.collection.createIndexes() and db.collection.createIndex() methods, when using a read concern level other than "local".

  • listCollectionslistIndexes 命令及其辅助方法。

  • 其他非增删改查和非信息性操作,例如 createUsergetParametercount 及其助手。

  • 并行操作。要同时更新多个命名空间,请考虑改用 bulkWrite 命令。

  • 写入固定大小集合。

  • 从固定大小集合中读取时使用读关注(read concern)"snapshot" 。(从MongoDB 5.0 开始)

  • 读取/写入 configadminlocal 数据库中的集合。

  • 写入 system.* 集合。

  • 使用 explain 或类似命令返回支持的操作的查询计划。

  • 在ACID 事务外部创建的游标上调用 getMore,或在ACID 事务外部对ACID 事务内创建的游标调用 getMore

  • killCursors 命令指定为ACID 事务中的第一个操作。

    注意

    如果在ACID 事务中运行killCursors 命令,服务器将立即停止指定的游标。它不会等待ACID 事务提交。