2014-11-24 82 views
2

範圍:MongoDB「forEach」命令在哪裏運行?

我有一個需要被「固定」(價格正常化和一些屬性值和名稱的變化)MongoDB的幾個集合託管的服務器上。

爲了解決這些問題,我目前在Robomongo tool上本地(不在服務器上)執行foreach command,但這個過程比我預期的要長一點。

這是我正在運行的命令之一來確定集合的價格。

db.Products_PoC.find().forEach(function(myDoc) { 
    myDoc.price = (myDoc.price.toFixed(2)) * 100; 
    db.Products_PoC.save (myDoc); 
}); 

故障排除:

快速排除故障後,好像工具正在執行的,而不是所有的服務器端(這將是更快的方式)的客戶端此操作。快速瀏覽一下任務管理器,可以看出Robomongo進程的網絡使用率高達5.5 mb/s。

問:

有什麼辦法,我可以在服務器上運行這樣的命令,而不是在本地?

回答

3

您可以使用eval函數在MongoDB服務器上運行代碼。例如:

db.eval(function() { 
    db.Products_PoC.find().forEach(function(myDoc) { 
     myDoc.price = (myDoc.price.toFixed(2)) * 100; 
     db.Products_PoC.save (myDoc); 
     }); 
    }); 

更多關於eval的信息here。請注意,db.eval將對您的數據庫執行全局寫入鎖定。

+0

在數據庫級別或集合級別上發出鎖定嗎? 有什麼辦法可以運行「Collection.Eval()」或只鎖定特定集合的東西? – 2014-11-24 15:19:02

+1

@MarcelloGrechiLins,我相信它在數據庫級別上,並且不確定是否可以在集合級別上執行此操作。但是,您可以使用[eval](http://docs.mongodb.org/manual/reference/command/eval/)命令和_nolock_選項。 – ialekseev 2014-11-24 17:13:23