从MongoDB Update 文档中,他们谈到更新操作符是原子的。如果以下查询在同一时刻被调用五次并且 Zugwalt 的声誉从零开始,我希望最终声誉为 5:
db.rep.update({_id: "Zugwalt"}, {$inc: {reputation: 1}});
但是,如果更新查询是这样的呢?
db.rep.update({_id: "Zugwalt", reputation: {$lte: 3}}, {$inc: {reputation: 1}});
声望是否总是只更新 3 次,还是有一些奇怪的比赛条件可能会更多?
我的特殊情况是使用活动用户“声明文档”。我执行类似于以下的查询:
db.myCollection.update({_id: "doc_id", activeUser: {$exists: false}}, {$set: {activeUser: "Zugwalt"}});
理想情况下,如果此查询在同一实例中多次触发,则只有一次更新会导致集合被修改。但是,如果搜索组件在更新时不是原子的,我可以看到一个竞争条件,它首先更新为将 activeUser 设置为一个用户,然后立即设置为另一个用户。
旁注:findAndModify命令具有这种原子性似乎更清楚,但是我不想使用它,因为在我们使用 node-js 驱动程序的经验测试中,在重负载下总体上看起来要慢得多。