目录

  • 1 多文档事务支持的操作
  • 1.1 CRUD操作
  • 1.2 计数操作
  • 1.3 去重操作
  • 1.4 信息操作
  • 2 受限制的操作

进入MongoDB中文手册(4.2版本)目录

对于事务:

  • 您可以在现有集合上指定读/写(CRUD)操作。集合可以在不同的数据库中。有关CRUD操作的列表,请参阅CRUD操作。
  • 您无法写入固定集合。(从MongoDB 4.2开始)
  • 你不能对config,admin或local数据库的集合进行读/写
  • 您不能写入system.*集合。
  • 您无法返回支持的操作的查询计划(即explain)
  • 对于在事务外部创建的游标,不能在事务内部调用getMore
  • 对于在事务中创建的游标,不能在事务外部调用getMore
  • 从MongoDB 4.2开始,您不能指定killCursors作为事务中的第一个操作。

1 多文档事务支持的操作

1.1 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阶段上使用聚合管道 。请参阅去重操作。

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()

多种批量操作方法

对于插入操作,仅在针对现有集合运行时使用。对于upsert,仅当针对现有集合运行时使用。

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

1.2 计数操作

要在事务中执行计数操作,请使用 $count聚合阶段或$group(带有$sum表达式的)聚合阶段。 与4.0功能兼容的MongoDB驱动程序提供了一个集合级API countDocuments(filter, options)作为帮助器方法,该方法将$group与$sum表达式一起使用来执行计数。4.0驱动程序已弃用API count()。 从MongoDB 4.0.3开始,mongo shell提供了将db.collection.countDocuments()帮助器方法将$group与$sum表达式配合使用来执行计数的方法。

1.3 去重操作

在事务中执行去重操作:

  • 对于未分片的集合,您可以使用 db.collection.distinct()方法和distinct命令以及带有$group阶段的聚合管道。
  • 对于分片集合,不能使用 db.collection.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 ] }

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

1.4 信息操作

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

2 受限制的操作

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

  • 影响数据库目录的操作(比如创建或删除集合或索引)。例如,事务不能包含创建新集合的插入操作。 listCollections和listIndexes 命令及其帮助器方法也被排除。
  • 非CRUD和非信息的操作,如 createUser,getParameter, count,等和他们的帮助器。

进入MongoDB中文手册(4.2版本)目录