目录
- 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版本)目录