mongodb update的搜索组件也是原子的吗?

mongodb update的搜索组件也是原子的吗?,mongodb,atomic,Mongodb,Atomic,从一开始,他们谈论更新操作符是原子的。如果在同一时刻调用下面的查询五次,并且Zugwalt的信誉从零开始,那么我希望在最后信誉为5: db.rep.update({_id: "Zugwalt"}, {$inc: {reputation: 1}}); 但是,如果更新查询是这样的呢 db.rep.update({_id: "Zugwalt", reputation: {$lte: 3}}, {$inc: {reputation: 1}}); 声誉是否总是只更新三次,或者是否存在一些奇怪的比赛条件

从一开始,他们谈论更新操作符是原子的。如果在同一时刻调用下面的查询五次,并且Zugwalt的信誉从零开始,那么我希望在最后信誉为5:

db.rep.update({_id: "Zugwalt"}, {$inc: {reputation: 1}});
但是,如果更新查询是这样的呢

db.rep.update({_id: "Zugwalt", reputation: {$lte: 3}}, {$inc: {reputation: 1}});
声誉是否总是只更新三次,或者是否存在一些奇怪的比赛条件,可能会更高

我的特殊情况是使用活动用户“声明文档”。我执行类似于以下内容的查询:

db.myCollection.update({_id: "doc_id", activeUser: {$exists: false}}, {$set: {activeUser: "Zugwalt"}});
理想情况下,如果此查询在同一实例上多次触发,则只有一次更新将导致修改集合。但是,如果搜索组件不是原子的,那么我可以看到一个竞争条件,在这个条件下,它第一次更新是将activeUser设置为一个用户,然后立即设置为另一个用户


旁注:似乎更清楚的是,该命令具有这种原子性,但我不想使用它,因为在我们对node js驱动程序进行的实证测试中,它在重载情况下整体速度似乎慢得多。

对于这种情况,您应该使用它。它是完全原子的

大概是这样的:

db.runCommand({findAndModify: 'myCollection',
               query: {_id: "doc_id", activeUser: {$exists: false}},
               update: {$set: {activeUser: "Zugwalt"}}})

在MongoDB中,更新是原子的。如果不需要取回文档,则不需要使用findAndModify

在你给出的场景中,预期的事情将会发生——在第一种情况下,声誉最终为5,在第二种情况下,声誉最终为4

在您的情况下,只有一个更新将成功设置activeUser


这是一个讨论MongoDB中原子操作的示例。

正如我在侧注中指出的,我意识到FindModify是,但是我想知道更新是否是完全原子的,并且我们不需要修改的对象。如果将其与安全模式下的更新进行比较,会怎么样?速度可比吗(相同)?我们在安全模式下进行更新,它们仍然比FindModify快得多(这让我怀疑它是否是原子的)。现在如果你需要取回你修改的文档,那么你会想使用FindModify。嘿,Asya,你怎么知道这一点?你能提供一个链接吗?同样在我们的经验中,我们发现使用更新,然后查找要比FindModify快得多!可能是因为我们使用的nodejs有一个单事件循环,所以在更新和查找之间能够有机会执行其他东西是很好的。我将添加到答案的链接-这里是示例2: