Transactions and Operations事务和操作
On this page本页内容
For transactions:对于事务:
You can specify read/write (CRUD) operations on existing collections.您可以在现有集合上指定读/写(CRUD)操作。For a list of CRUD operations, see CRUD Operations.有关CRUD操作的列表,请参阅CRUD操作。Starting in MongoDB 4.4, you can create collections and indexes in transactions.从MongoDB 4.4开始,您可以在事务中创建集合和索引。For details, see Create Collections and Indexes In a Transaction有关详细信息,请参阅在事务中创建集合和索引。The collections used in a transaction can be in different databases.事务中使用的集合可以在不同的数据库中。NoteYou cannot create new collections in cross-shard write transactions.不能在跨分片写入事务中创建新集合。For example, if you write to an existing collection in one shard and implicitly create a collection in a different shard, MongoDB cannot perform both operations in the same transaction.例如,如果您在一个分片中写入一个现有集合,并在另一个分片中隐式创建一个集合,则MongoDB无法在同一事务中执行这两个操作。You cannot write to capped collections. (Starting in MongoDB 4.2)您不能写入封顶集合。(从MongoDB 4.2开始)You cannot use read concern从封顶集合中读取时,不能使用读取关注点"snapshot"
when reading from a capped collection. (Starting in MongoDB 5.0)"snapshot"
。(从MongoDB 5.0开始)You cannot read/write to collections in the无法读取/写入config
,admin
, orlocal
databases.config
、admin
或local
数据库中的集合。You cannot write to无法写入system.*
collections.system.*
集合。You cannot return the supported operation's query plan (i.e.无法返回支持的操作的查询计划(即explain
).explain
)。
For cursors created outside of a transaction, you cannot call对于在事务外部创建的游标,不能在事务内部调用getMore
inside the transaction.getMore
。For cursors created in a transaction, you cannot call对于在事务中创建的游标,不能在事务外调用getMore
outside the transaction.getMore
。
Starting in MongoDB 4.2, you cannot specify从MongoDB 4.2开始,您不能将killCursors
as the first operation in a transaction.killCursors
指定为事务中的第一个操作。
Operations that affect the database catalog, such as creating or dropping a collection or an index, are not allowed in multi-document transactions. 在多文档事务中,不允许执行影响数据库目录的操作,例如创建或删除集合或索引。For example, a multi-document transaction cannot include an insert operation that would result in the creation of a new collection. 例如,多文档事务不能包含会导致创建新集合的插入操作。See Restricted Operations.请参阅受限操作。
Operations Supported in Multi-Document Transactions多文档事务中支持的操作
CRUD OperationsCRUD操作
The following read/write operations are allowed in transactions:事务中允许以下读/写操作:
db.collection.aggregate() | aggregate | |
db.collection.countDocuments() | $match aggregation stage for the query and $group aggregation stage with a $sum expression to perform the count. $match 聚合阶段和带有$sum 表达式的$group 聚合阶段来执行计数。 | |
db.collection.distinct() | distinct | $group stage. $group 阶段的聚合管道。 |
db.collection.find() | find | |
db.collection.deleteMany() db.collection.deleteOne() db.collection.remove() | delete | |
db.collection.findOneAndDelete() db.collection.findOneAndReplace() db.collection.findOneAndUpdate() | findAndModify | upsert: true on a non-existing collection, the collection is implicitly created.upsert:true 运行更新或替换操作,则会隐式创建该集合。upsert: true , the operation must be run on an existing collection. upsert:true ,则该操作必须在现有集合上运行。Tip
|
db.collection.insertMany() db.collection.insertOne() | insert | Tip
|
db.collection.updateOne() db.collection.updateMany() db.collection.replaceOne() | update | Tip
|
db.collection.bulkWrite() | Tip
|
Updates to Shard Key Values分片键值的更新
Starting in MongoDB 4.2, you can update a document's shard key value (unless the shard key field is the immutable 从MongoDB 4.2开始,您可以通过在事务中或作为可重试写入发出单个文档_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 compatible with the 4.0 features provide a collection-level API 与4.0功能兼容的MongoDB驱动程序提供了一个集合级API countDocuments(filter, options)
as a helper method that uses the $group
with a $sum
expression to perform a count. The 4.0 drivers have deprecated the count()
API.countDocuments(filter, options)
作为一个助手方法,使用带有$sum
表达式的$group
来执行计数。4.0驱动程序已弃用count()
API。
Starting in MongoDB 4.0.3, 从MongoDB 4.0.3开始,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/thedistinct
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 thedistinct
command.db.collection.distinct()
方法或distinct
命令。To find the distinct values for a sharded collection, use the aggregation pipeline with the要查找分片集合的不同值,请使用带有$group
stage instead.$group
阶段的聚合管道。For example:例如:Instead of不使用db.coll.distinct("x")
, usedb.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.迭代游标以访问结果文档。
DDL OperationsDDL操作
Starting in MongoDB 4.4 with feature compatibility version (fcv) 从功能兼容版本(fcv)“4.4”的MongoDB 4.4开始,如果事务不是跨分片写入事务,则可以在多文档事务中创建集合和索引。"4.4"
, you can create collections and indexes inside a multi-document transaction if the transaction is not a cross-shard write transaction.
Explicit DDL Operations显式DDL操作
create | db.createCollection() | |
createIndexes | db.collection.createIndex() db.collection.createIndexes() |
For more information on creating collections and indexes in a transaction, see Create Collections and Indexes In a Transaction.有关在事务中创建集合和索引的详细信息,请参阅在事务中新建集合和索引。
Implicit DDL Operations隐式DDL操作
You can also implicitly create a collection through the following write operations against a 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 operationsupsert:true 操作的db.collection.bulkWrite() upsert:true operationsupsert: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.hello
、buildInfo
、connectionStatus
(及其辅助方法);但是,它们不能是事务中的第一个操作。
Restricted Operations受限操作
Changed in version 4.44.4版更改.
The following operations are not allowed in transactions:事务记录中不允许执行以下操作:
Operations that affect the database catalog, such as creating or dropping a collection or an index when using MongoDB 4.2 or lower.影响数据库目录的操作,例如在使用MongoDB 4.2或更低版本时创建或删除集合或索引。Starting in MongoDB 4.4, you can create collections and indexes in transactions unless the transaction is a cross-shard write transaction.从MongoDB 4.4开始,您可以在事务中创建集合和索引,除非事务是跨分片写入事务。For details, see Create Collections and Indexes In a Transaction.有关详细信息,请参阅在事务中创建集合和索引。Creating new collections in cross-shard write transactions.在跨分片写入事务中创建新集合。For example, if you write to an existing collection in one shard and implicitly create a collection in a different shard, MongoDB cannot perform both operations in the same transaction.例如,如果您在一个分片中写入一个现有集合,并在另一个分片中隐式创建一个集合,则MongoDB无法在同一事务中执行这两个操作。Explicit creation of collections, e.g.当使用“local”以外的读取关注级别时,显式创建集合,例如db.createCollection()
method, and indexes, e.g.db.collection.createIndexes()
anddb.collection.createIndex()
methods, when using a read concern level other than"local"
.db.createCollection()
方法,以及索引,例如db.collection.createIndexes()
和db.collection.createIndex()
方法。ThelistCollections
andlistIndexes
commands and their helper methods.listCollections
和listIndexes
命令及其辅助方法。Other non-CRUD and non-informational operations, such as其他非CRUD和非信息性操作,如createUser
,getParameter
,count
, etc. and their helpers.createUser
、getParameter
、count
等及其辅助方法。