首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一次操作中的MongoDB updateMany

一次操作中的MongoDB updateMany
EN

Stack Overflow用户
提问于 2022-02-18 18:07:45
回答 1查看 339关注 0票数 0

我和来自猫鼬的updateMany有一种奇怪的行为。

以下是主要的模式:

代码语言:javascript
运行
复制
const Event = {
  user: {ref: 'user'},
  status: String, // one of notProcessed | locked | processed
  ...otherDatas,
}

我有多个nodeJs应用实例,其目标是处理所有事件。这里唯一的限制是,为了保持计算中的一致性,每个实例必须按照插入顺序处理来自特定用户的事件。以下是每个实例的简化代码:

代码语言:javascript
运行
复制
const freeToProcessUser = await Event.findOne({ status: 'notProcessed'})

const updateResult  = await Event.updateMany({ 
  status: 'notProcessed', // this is useful in case a concurrent instance has updated the events in between the two db calls
  user: freeToProcessUser._id
}, { 
  status: 'locked' // update status to lock so another instance cannot process it
})
if (updateInfos.modifiedCount > 0) {
  // all events are now "locked"
  // so here I can process events from this user
}

我使用一个本地mongoDb实例。

问题所在

问题是,当我启动测试时,我注意到有时有两个实例有updateInfos.modifiedCount > 0!例如,对于DB中针对特定用户的6个事件,5由第一个实例更新,1个由另一个实例更新。

当两个实例几乎同时执行更新时,就会发生这种情况。看来两个更新请求都在修改结果.

因此,如何使一个在一个操作中更新所有文档,以便其他查询不能同时运行?

希望我说得够清楚了,如果你需要更多的细节,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2022-02-19 01:20:21

正如文档所说:

When a single write operation (e.g. db.collection.updateMany()) modifies multiple documents, the modification of each document is atomic, but the operation as a whole is not atomic.

您需要为每个用户将状态嵌入到单个文档中,或者让应用程序原子地处理用户。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71178038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档