0

是否可以插入或更新集合中的项目只有满足条件时才会出现竞争条件?Mongo:消除有条件更新时的竞争条件

例如,假设我收集了一个timestamp字段和一个temperature字段。只有在时间戳至少一个小时之后才能更新特定项目?我知道我可以(第1步)用一次调用检查时间戳,然后(第2步)进行一些数学计算,看看时间戳是否超过一小时,然后(第3步)更新集合中的项目,如果是这样的话。

但是,如果另一个客户端在此客户端运行第2步时更新客户端,则会失败。然后,当我只需要更新客户端时,会发生两个更新。

这不是我正在处理的具体情况,而是说明了我的问题。如果一个蒙戈操作取决于另一个蒙戈操作,如何解决竞争条件?

回答

4

你需要的是findAndModify

它允许做GET后跟UPDATE在一个单一的操作。

findAnModify()

db.col.findAndModify({ 
    query: { processed: false }, 
    update: { $inc: { score: 1 }, $set:{processed: true} } 
}) 
+0

时,您可以使用一个处理标志,第一个假和更改,否则解决方案是那么完美,我不得不寻找它,以确保你不拉我的腿!谢谢! – 2015-01-21 07:52:08