2016-08-15 109 views
0

我有一組節點工作服務器處理命中api並將數據插入到mongo數據庫中。我遇到的問題是這些功能中的一個出現在每個窗口中,因此經常插入同一文檔的兩個副本。它檢查文件是否已經有像這樣的查詢創建:節點集羣:確保一次只有一個函數實例正在運行

gameDetails.findOne({ gameId: gameId }, function(err, gameCheck) { 

      if (!gameCheck) { //insert the document }; 

我怎樣才能確保此功能始終是一次只能運行一個實例。或者,如果我沒有推導出實際的根問題,那麼可能會導致這樣的mongo查詢有時會導致包含相同gameId的同一文檔的多個要插入的內容?

回答

0

findOne被多次調用該文件有時間被插入,即像下面發生的事情之前:

findThenInsert() findThenInsert() findThenInsert() // findOne returns null, insert called // findOne returns null, insert called // document gets inserted // findOne returns a gameCheck // document gets inserted

你應該使用一個唯一索引,以防止重複。然後,你的節點實例可以樂觀地調用插入,如果它們太晚,就簡單地處理錯誤,這與你的'如果找不到'邏輯類似。

另外,如果你不介意的文件被每一次更新,你可以使用UPSERT方法,該方法是原子:

db.collection.update(query, update, {upsert: true})

另見

MongoDB atomic "findOrCreate": findOne, insert if nonexistent, but do not update

相關問題