2016-02-27 75 views
0

在node.js的,假設你有異步調用的順序的MongoDB如:Node.js和MongoDB - 多個異步數據庫操作的原子性?

collection.find(query, projection).toArray(function(err, result) { 

    var document = result[0]; 

    // Do something based off of fields in document... 

    collection.update(...)(function(err, result) { 

     // Do something... 

    }); 
}); 

這是否會整塊發生原子?或者在快速連續多次調用此方法時可能發生交錯?

我的想法是:由於find是一個異步操作,它發生在一些後臺線程上。因此,第二次調用此方法可能會運行相同的find命令並在第一次調用之前有機會更新文檔之前得到完全相同的結果。然後第二個調用對文檔有一個陳舊的引用。

這是正確的還是我想這一切都錯了?

回答

3

不,這不是代碼的原子塊。快速多次調用代碼可以在更新之前多次調用find,因此不會運行您想要的更新。如果您使用各種update operators而不是讀取值,則在代碼中更新它們,然後將值寫回來,MongoDB具有原子更新。

inc是最簡單的一個例子。您可以編寫代碼來讀取數字,將其增加,然後將更新的值寫回。但是,如果同時調用該代碼,它可以讀取值兩次,兩次調用將數字遞增爲相同的值,其中一次寫入「勝利」 - 將值增加一次而不是兩次。然而,使用inc會自動處理此案例(仔細考慮您的write concern)。

要更具體地回答您的問題,請使用MongoDB更新操作符實現「基於文檔中的字段執行某些操作」。