为了账号安全,请及时绑定邮箱和手机立即绑定

MongoDB updateOne() 返回 "modifiedCount":

MongoDB updateOne() 返回 "modifiedCount":

Go
白板的微信 2022-07-11 17:40:25
我们正在尝试使用 更新文档updateOne()。过滤器识别文档,我们使用 更新文档的属性$set。此更新作业每分钟由一个 cron 作业触发。说,原始文件是{_id: "USER1001", status: "INACTIVE"}. 我们通过updateOne()使用过滤器调用{_id: "USER1001", status: "INACTIVE"}并将状态字段更新为来更新它{"$set":{status:"ACTIVE"}}。我们查看结果值modifiedCount并期望它为 1,以声明updateOne()操作成功。然后这会触发下游作业。该应用程序在 Kubernetes 中运行,我们已经对其进行了扩展。当我们在负载下测试系统时updateOne(),会从两个不同的 Pod 使用相同的过滤器同时调用同一个文档,并且都返回modifiedCount1。我们期望modifiedCount1 对应一个 pod,0 对应另一个。但是对于一些文件,我们看到了这个结果。示例代码供参考// cron job that calls update() every minutefunc update(){  filter := bson.D{{"_id", "USER1001"}, {"status", "INACTIVE"}}  result, err := collection.UpdateOne(context.Background(), filter, bson.M{"$set": bson.M{"status": "ACTIVE"}})    if result.ModifiedCount != 1 {    // no update done  } else {    // call downstream jobs  }}我们从应用程序 pod 中获得的示例日志行POD-1[2020-11-20 17:30:58.610518875 +0000 UTC] [DEBUG] [myJob-7dc8b78bcf-c4677] update() :: 更新结果 :: USER1001 / Matched=1 / Modified=1POD-2[2020-11-20 17:30:58.409843674 +0000 UTC] [调试] [myJob-7dc8b78bcf-jd7m8] update() :: 更新结果 :: USER1001 / Matched=1 / Modified=1这里的问题是——有没有其他人看到过这种行为?什么可能导致此问题?附加信息,该应用程序在 Go 中Mongo 是 4.4 和我们正在使用最新的 mongo-driver 进行 go。cron 作业每分钟运行一次,而不是一分钟。意思就是,10:00:3510:01:3510:02:35 等10:00:2310:01:2310:02:23 等POD-1 可能会运行它,POD-2 可能会运行它,
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

如果您先阅读此文档,发现它处于非活动状态,然后决定激活它,这是您必须处理的常见竞争条件。另一个进程做同样的事情,然后都更新文档。

有办法防止这种情况发生。Mongodb 文档级别的操作是原子的,因此对于您的情况,最简单的解决方案是更改您的过滤器以{_id:"USER1001","status":"INACTIVE"}确保文档在您更新它时处于非活动状态。然后只有一个节点会成功更新文档,尽管多个节点可能会尝试更新它。


查看完整回答
反对 回复 2022-07-11
?
互换的青春

TA贡献1797条经验 获得超6个赞

我过去也有类似的要求。我建议您尝试使用“锁定”机制。它在操作运行时防止另一个操作。

作为参考,请查看:https ://www.mongodb.com/blog/post/how-to-select--for-update-inside-mongodb-transactions

官方文档:

需要注意的是,我记得,Mongo Server 应该是一个“副本集”。不可能是一个人。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 403 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号