On this page本页内容
For transactions:
"4.4" or greater, you can create collections and indexes in transactions. For details, see Create Collections and Indexes In a TransactionNote
You 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.
config, admin, or local databases.system.* collections.explain).getMore inside the transaction.getMore outside the transaction.killCursors as the first operation in a transaction.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.
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 | |
db.collection.distinct() |
distinct |
Available on unsharded collections. For sharded collections, use the aggregation pipeline with the $group stage. See Distinct Operation. |
db.collection.find() |
find |
|
geoSearch |
||
delete |
||
findAndModify |
For feature compatibility version (fcv) For fcv
| |
insert |
For feature compatibility version (fcv) For fcv
| |
db.collection.save() |
For feature compatibility version (fcv) With fcv
| |
update |
For feature compatibility version (fcv) For fcv
| |
For feature compatibility version (fcv) For fcv
|
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 _id field) by issuing single-document update/findAndModify operations either in a transaction or as a retryable write. For details, see Change a Document’s Shard Key Value.
To perform a count operation within a transaction, use the $count aggregation stage or the $group (with a $sum expression) aggregation stage.
MongoDB drivers compatible with the 4.0 features provide a collection-level 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.
Starting in MongoDB 4.0.3, the mongo shell provides the db.collection.countDocuments() helper method that uses the $group with a $sum expression to perform a count.
To perform a distinct operation within a transaction:
db.collection.distinct() method/the distinct command as well as the aggregation pipeline with the $group stage.db.collection.distinct() method or the distinct command.
To find the distinct values for a sharded collection, use the aggregation pipeline with the $group stage instead. For example:例如:
db.coll.distinct("x"), use
db.coll.distinct("x", { status: "A" }), use:
The pipeline returns a cursor to a document:
Iterate the cursor to access the results document.
Starting in MongoDB 4.4 with feature compatibility version (fcv) "4.4", you can create collections and indexes inside a multi-document transaction if the transaction is not a cross-shard write transaction.
| Command | Method | |
|---|---|---|
create |
db.createCollection() |
See also the Implicit DDL Operations. |
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".
For more information on creating collections and indexes in a transaction, see Create Collections and Indexes In a Transaction.
See also参阅
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: truedb.collection.findOneAndReplace() with upsert: truedb.collection.findOneAndUpdate() with upsert: true |
findAndModify with upsert: true |
insert | |
db.collection.save() results in an insert |
|
db.collection.updateOne() with upsert: truedb.collection.updateMany() with upsert: truedb.collection.replaceOne() with upsert: truedb.collection.update() with upsert: true |
update with upsert: true |
db.collection.bulkWrite() with insert or upsert:true operationsVarious Bulk Operation Methods with insert or upsert:true operations |
For other CRUD operations allowed in transactions, see CRUD Operations.
For more information on creating collections and indexes in a transaction, see Create Collections and Indexes In a Transaction.
See also参阅
Informational commands, such as isMaster, buildInfo, connectionStatus (and their helper methods) are allowed in transactions; however, they cannot be the first operation in the transaction.
Changed in version 4.4.在版本4.4中更改。
The following operations are not allowed in transactions:
"4.2" or lower. With fcv "4.4" or greater, you can create collections and indexes in transactions unless the transaction is a cross-shard write transaction. For details, see Create Collections and Indexes In a Transaction.db.createCollection() method, and indexes, e.g. db.collection.createIndexes() and db.collection.createIndex() methods, when using a read concern level other than "local".listCollections and listIndexes commands and their helper methods.createUser, getParameter, count, etc. and their helpers.See also参阅