2013-03-27 79 views
1

讀我想通了,如何從客戶的Node.js運行 MongoDB服務器,上的JavaScript代碼:執行非阻塞EVAL MongoDB中

db.eval("function(x){ return x*10; }", 1, function (err, retval) { 
    console.log('err: '+err); 
    console.log('retval: '+retval); 
}); 

而且工作正常。但文檔說db.eval()發出寫入鎖定,所以沒有別的東西可以讀取或寫入數據庫。我不要那個。

它也說eval沒有這樣的限制,但我不知道在哪裏可以找到它。從他們談論的方式來看,似乎只有在mongo shell中才可以使用常規的eval,而在客戶端則不可以。

因此:如何在mongodb服務器上運行這些存儲過程而不阻塞所有內容?

回答

1

你可以通過使用NOLOCK設置爲true作爲一個可選的第三個參數現場的目的是EVAL:

db.eval('function (x) {return x*10; }', [1], {nolock:true}, function(err, retval) { 
    console.log('err: '+err); 
    console.log('retval: '+retval); 
}); 

注意,這阻止EVAL從設定強制性寫鎖定,但它並不妨礙你的函數內部的任何操作都可以自行創建寫鎖。

來源:the documentation

請注意,在這種情況下,術語「存儲過程」是錯誤的。存儲過程是指存儲在數據庫本身而不是應用程序層傳遞的代碼。 MongoDB也可以利用特殊集合db.system.js來做到這一點,但這樣做是不鼓勵的:http://docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side

順便說一句:MongoDB不是專爲存儲過程而設計的。通常建議在應用層上實現任何高級邏輯。作爲存儲過程實現微不足道的操作(例如有時在SQL數據庫上完成)的做法是不鼓勵的。

0

這,這是存儲在服務器端的功能的方式,你呼叫時使用,如下圖所示:

db.system.js.save( {  _id : "myAddFunction" , value : function (x,y) 
{ return x +y;} }); 

db.system.js.find() 

{ "_id" : "myAddFunction", "value" : function (x,y){ return x + y; } } 


db.eval("myAddFunction(1 ,2)") 
3 
+0

你應該指出的是,使用db.system.js積極勸阻。摘自[文檔](http://docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side):「**注:**我們不** *如果可能,推薦使用服務器端存儲的功能。「 – Philipp 2013-03-27 20:35:18