事务和操作


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值