2014-01-27 27 views
1

mongo shell默認爲安全寫入,根據我的理解,這發生在每次回車結束時發生。如果你有這樣的循環代碼:在mongodb shell中編寫關注javascript for each函數

db.coll1.find().forEach(function(doc){ 
    db.coll2.update({"blah": doc._id}, {$set: {"blahblah": doc.value}}); 
}); 

是否db.getLastError()發生的每一次更新或僅在的最末尾的最後一次更新循環?或者是否在每次更新的文檔的for循環結束時都發生?

回答

2

在交互模式下,shell實際上具有w:1(安全寫入),當在循環中運行時,它不會調用​​直到結束。

正如參考實際上你可以看到@Asya誰MongoDB的公司

的外殼,它的每一個「命令」(即回車)後調用GetLastError函數使用安全工作這條評論。如果你正在寫數據,比如說,在一個循環中,那麼GLE最終只會被調用一次。提供有關您計劃如何從殼填充集合的詳細信息 - 也許是正確的事情就已經發生

Setting MongoDB's write concern in shell/shell script

+0

對,但我的問題是關於所有更新文檔的寫入安全性。最後調用的GLE是否僅適用於for循環的最後一次迭代,還是一次檢查每個更新的文檔?所以說for循環運行超過10個文件。如果前9次寫入失敗但#10成功,我會甚至知道9次失敗嗎? –

+0

@JoshKim GLE只會進行最後一次操作,即最後一次更新 – Sammaye

+0

@JoshKim如果你想知道其他你需要自己調用GLE的人 – Sammaye

0

添加到從Sammaye這個問題的答案,如果你想叫GLE後,每次更新你打電話會做這樣的事情:

db.coll1.find().forEach(function(doc){ 
    db.coll2.update({"blah": doc._id}, {$set: {"blahblah": doc.value}}, true); 
    if(db.getLastError(1)){ 
     printjson(db.getLastError(1)); 
     printjson("failed to update ID: "+doc._id) 
    }; 
}); 

你會在因爲回車循環的結束處獲取受騙人的錯誤如果最後運失敗,但除此之外,它幾乎是你所期望的。如果您想簡單測試重現,只需將value字段設置爲字符串,然後使用$inc而不是$set - 這將在非數字上失敗。