2013-03-27 124 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