事务操作

本页中

对于事务来说:

  • 您可以在现有集合上指定读/写(CRUD)操作。其中集合可以在不同的数据库中。有关CRUD操作的列表,请参见 CRUD 操作

  • 您无法写入 capped 集合。 (从MongoDB 4.2开始)

  • 您无法在config,admin或local数据库中读写集合。

  • 您无法写入 system.* 集合。

  • 您无法返回支持的操作的查询计划(如:explain)。

  • 对于在事务外部创建的游标,不能在事务内部调用 getMore 命令。

  • 对于在事务中创建的游标,不能在事务外调用 getMore

  • 从MongoDB 4.2开始,您不能在 事务 中将 killCursors 作为第一个操作。

多文档事务中不允许执行影响数据库目录的操作,例如创建或删除集合或索引。例如,多文档事务不能包含将导致创建新集合的插入操作。请参阅 限制的操作

多文档事务支持的操作

CRUD 操作

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

方法 命令 备注
db.collection.aggregate() aggregate 不包括以下阶段: $collStats $currentOp $indexStats $listLocalSessions $listSessions $merge $out $planCacheStats
db.collection.countDocuments() 不包含以下查询运算符表达式: $where $near $nearSphere 。该方法使用 $match 聚合阶段进行查询,并使用 $group 聚合阶段带有 $sum 表达式来执行计数。
db.collection.distinct() distinct 在未分片集合中可用。对于分片集合,请在 $group 阶段使用聚合管道。可查看 Distinct Operation
db.collection.find() find
geoSearch
db.collection.deleteMany() db.collection.deleteOne() db.collection.remove() delete
db.collection.findOneAndDelete() db.collection.findOneAndReplace() db.collection.findOneAndUpdate() findAndModify 仅在针对现有集合运行时使用 upsert
db.collection.insertMany() db.collection.insertOne() db.collection.insert() insert 仅在针对现有集合运行时使用。
db.collection.save() 如果插入,则仅在针对现有集合运行时。
db.collection.updateOne() db.collection.updateMany() db.collection.replaceOne() db.collection.update() update 仅在针对现有集合运行时使用 upsert
db.collection.bulkWrite() Various Bulk Operation Methods 如果插入,则仅在针对现有集合运行时。仅在针对现有集合运行时使用 upsert

分片键值更新

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

计数操作

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

与4.0功能兼容的MongoDB驱动程序提供了一个集合级API countDocuments(filter,options) 作为辅助方法,该方法使用带有 $group 表达式和 $sum 表达式的计数方法。 4.0驱动程序已弃用 count() API。

从MongoDB 4.0.3开始, mongo shell 提供了 db.collection.countDocuments() 方法,该方法使用 $group $sum 表达式来执行计数。

Distinct 操作

在事务中执行distinct操作:

要查找分片集合的distinct值,请使用带有 $group 阶段的聚合管道。例如:

  • 替代 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 ] }
    

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

信息操作

信息命令,例如 isMaster , buildInfo , connectionStatus (及其辅助方法)在事务中是被允许的;但是,它们不能是事务中的第一个操作。

受限制的操作

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

  • 影响数据库目录的操作,如创建或删除集合或索引。例如,事务不能包含会导致创建新集合的插入操作。

    listCollections listIndexes 命令及其辅助方法也被排除在外。

  • 非CRUD和非信息性操作,例如 createUser , getParameter , count 等等及其辅助方法。

另请参见:

待处理的DDL操作和事务

原文链接: https://docs.mongodb.com/manual/core/transactions-operations/

译者:王金铷

Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持 文件修订时间: 2020-10-11 20:53:05

results matching " "

    No results matching " "