只有在满足条件且没有竞争条件的情况下,是否可以插入或更新集合中的项目?
例如,假设我有一个包含timestamp
字段和temperature
字段的集合。只有在时间戳至少有一个小时的情况下才能更新特定项目吗?我知道我可以(步骤1)通过一次调用检查时间戳,然后(步骤2)进行一些数学运算以查看时间戳是否超过一小时前,然后(步骤3)更新集合中的项目(如果是)。
但是如果另一个客户端在此客户端运行第2步时更新客户端,则会失败。然后,当我只想要一个更新时,会发生两次更新。
这不是我正在处理的具体案例,但说明了我的问题。如果mongo操作依赖于另一个mongo操作,那么如何解决竞争条件?
答案 0 :(得分:5)
您需要的是findAndModify
;)
它允许在单个操作中执行GET
后跟UPDATE
。
您可以使用处理标记,首先是false,然后在执行findAnModify()
db.col.findAndModify({
query: { processed: false },
update: { $inc: { score: 1 }, $set:{processed: true} }
})