Database Manual / Transactions

Transactions and Operations事务和运营

For transactions:对于事务:

Operations Supported in Multi-Document Transactions多文档事务中支持的操作

CRUD OperationsCRUD操作

The following read/write operations are allowed in transactions:事务中允许进行以下读/写操作:

Method方法Command命令Note
db.collection.aggregate()aggregate

Excluding the following stages:不包括以下阶段:

db.collection.countDocuments()

Excluding the following query operator expressions:不包括以下查询运算符表达式:

The method uses the $match aggregation stage for the query and $group aggregation stage with a $sum expression to perform the count.该方法使用$match聚合阶段进行查询,使用$group聚合阶段和$sum表达式进行计数。

db.collection.distinct()distinct

Available on unsharded collections.可在未录制的集合中使用。

For sharded collections, use the aggregation pipeline with the $group stage. See Distinct Operation.对于分片集合,使用带有$group阶段的聚合管道。请参阅distinct操作

db.collection.find()find
db.collection.deleteMany()
db.collection.deleteOne()
db.collection.remove()
delete
db.collection.findOneAndDelete()
db.collection.findOneAndReplace()
db.collection.findOneAndUpdate()
findAndModify

If the update or replace operation is run with upsert: true on a non-existing collection, the collection is implicitly created.如果更新或替换操作在不存在的集合上使用upsert:true运行,则隐式创建该集合。

For more details, see Administration Operations.有关更多详细信息,请参阅管理操作

db.collection.insertMany()
db.collection.insertOne()
insert

If run on a non-existing collection, the collection is implicitly created.如果在不存在的集合上运行,则隐式创建该集合。

For more details, see Administration Operations.有关更多详细信息,请参阅管理操作

db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
update

If run on a non-existing collection, the collection is implicitly created.如果在不存在的集合上运行,则隐式创建该集合。

For more details, see Administration Operations.有关更多详细信息,请参阅管理操作

db.collection.bulkWrite()
Various Bulk Operation Methods各种批量操作方法

If run on a non-existing collection, the collection is implicitly created.如果在不存在的集合上运行,则隐式创建该集合。

For more details, see Administration Operations.有关更多详细信息,请参阅管理操作

Note

Updates to Shard Key Values分片键值更新

You can update a document's shard key value (unless the shard key field is the immutable _id field) by issuing single-document update / findAndModify operations either in a transaction or as a retryable write. 您可以通过在事务中或作为可重试写入发出单个文档update/findAndModify操作来更新文档的分片键值(除非分片键字段是不可变的_id字段)。For details, see Change a Document's Shard Key Value.有关详细信息,请参阅更改文档的分片键值

Count Operation计数操作

To perform a count operation within a transaction, use the $count aggregation stage or the $group (with a $sum expression) aggregation stage.要在事务中执行计数操作,请使用$count聚合阶段或$group(带$sum表达式)聚合阶段。

MongoDB drivers provide a collection-level API countDocuments(filter, options) as a helper method that uses the $group with a $sum expression to perform a count.MongoDB驱动程序提供了一个集合级API countDocuments(filter, options)作为一个助手方法,使用带有$sum表达式的$group来执行计数。

mongosh provides the db.collection.countDocuments() helper method that uses the $group with a $sum expression to perform a count.mongosh提供了db.collection.countDocuments()辅助方法,该方法使用带有$sum表达式的$group来执行计数。

Distinct Operation独特的操作

To perform a distinct operation within a transaction:要在事务中执行不同的操作,请执行以下操作:

  • For unsharded collections, you can use the db.collection.distinct() method/the distinct command as well as the aggregation pipeline with the $group stage.对于未记录的集合,您可以使用db.collection.distinct()方法/distinct命令以及$group阶段的聚合管道。
  • For sharded collections, you cannot use the db.collection.distinct() method or the distinct command.对于分片集合,您不能使用db.collection.distinct()方法或distinct命令。

    To find the distinct values for a sharded collection, use the aggregation pipeline with the $group stage instead. For example:要查找分片集合的不同值,请使用带有$group阶段的聚合管道。例如:

    • Instead of db.coll.distinct("x"), use用以下方式代替db.coll.distinct("x")

      db.coll.aggregate([
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])
    • Instead of db.coll.distinct("x", { status: "A" }), use:用以下方式代替db.coll.distinct("x", { status: "A" })

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

    The pipeline returns a cursor to a document:管道将游标返回到文档:

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

    Iterate the cursor to access the results document.迭代游标以访问结果文档。

Administration Operations管理操作

You can create collections and indexes inside a distributed transaction if the transaction is not a cross-shard write transaction.如果分布式事务不是跨分片写入事务,则可以在该事务内创建集合和索引。

Explicit Create Operations显式创建操作

Command命令Method方法Notes备注
createdb.createCollection()See also the Implicit Create Operations.另请参见隐式创建操作
createIndexesdb.collection.createIndex()
db.collection.createIndexes()
The index to create must either be on a non-existing collection, in which case, the collection is created as part of the operation, or on a new empty collection created earlier in the same transaction.要创建的索引必须位于不存在的集合上,在这种情况下,该集合是作为操作的一部分创建的,或者位于同一事务中较早创建的新空集合上。

Note

For explicit creation of a collection or an index inside a transaction, the transaction read concern level must be "local".为了在事务中显式创建集合或索引,事务读取关注级别必须是"local"的。

For more information on creating collections and indexes in a transaction, see Create Collections and Indexes in a Transaction.有关在事务中创建集合和索引的更多信息,请参阅在事务中新建集合和索引

Implicit Create Operations隐式创建操作

You can also implicitly create a collection through the following write operations against a non-existing collection:您还可以通过以下对不存在的集合的写入操作隐式创建集合:

Method Run against Non-Existing Collection对不存在的集合运行的方法Command Run against Non-Existing Collection对不存在的集合运行的命令
db.collection.findAndModify() with upsert: true
db.collection.findOneAndReplace() with upsert: true
db.collection.findOneAndUpdate() with upsert: true
findAndModify with upsert: true
db.collection.insertMany()
db.collection.insertOne()
insert
db.collection.updateOne() with upsert: true
db.collection.updateMany() with upsert: true
db.collection.replaceOne() with upsert: true
update with upsert: true
db.collection.bulkWrite() with insert or upsert:true operations带有insertupsert:true操作
Various Bulk Operation Methods with insert or upsert:true operations各种带有insertupsert:true操作的批量操作方法

For other CRUD operations allowed in transactions, see CRUD Operations.有关事务中允许的其他CRUD操作,请参阅CRUD操作

For more information on creating collections and indexes in a transaction, see Create Collections and Indexes in a Transaction.有关在事务中创建集合和索引的更多信息,请参阅在事务中新建集合和索引

Informational Operations信息化运营

Informational commands, such as hello, buildInfo, connectionStatus (and their helper methods) are allowed in transactions; however, they cannot be the first operation in the transaction.事务中允许使用信息命令,如hellobuildInfoconnectionStatus(及其辅助方法);但是,它们不能是事务中的第一个操作。

Restricted Operations受限操作

The following operations are not allowed in transactions:事务中不允许执行以下操作: