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