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

事务和操作

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

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

方法
命令
注意

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

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

可用于未分片的集合。

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

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

有关详细信息,请参阅管理操作。

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

有关详细信息,请参阅管理操作。

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

有关详细信息,请参阅管理操作。

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

有关详细信息,请参阅管理操作。

注意

分片键值的更新

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

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

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

mongosh提供了db.collection.countDocuments() 辅助方法,该方法使用 和$group $sum表达式来执行计数。

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

  • 对于未分片的集合,可以使用 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(及其辅助方法)之类的信息命令,但它们不能是事务中的第一项操作。

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