我想出了如何在MongoDB服务器上运行javascript代码,来自node.js客户端:
db.eval("function(x){ return x*10; }", 1, function (err, retval) {
console.log('err: '+err);
console.log('retval: '+retval);
});
这很好用。但文档说db.eval()
发出写锁定,因此没有其他任何东西可以读写数据库。我不希望这样。
它还说eval
没有这样的限制,但我不知道在哪里找到它。从他们谈论它的方式来看,似乎常规eval
仅在mongo shell中可用,因此不是来自客户端。
那么:如何在不阻塞所有内容的情况下在mongodb服务器上运行这些存储过程?
答案 0 :(得分:1)
你可以将字段nolock设置为true的对象作为可选的第3个参数传递给eval:
db.eval('function (x) {return x*10; }', [1], {nolock:true}, function(err, retval) {
console.log('err: '+err);
console.log('retval: '+retval);
});
请注意,这可以防止eval设置强制写锁定,但它不会阻止函数内部的任何操作自行创建写锁定。
请注意,在这种情况下,术语“存储过程”是错误的。存储过程是指存储在数据库本身而不是由应用程序层传递的代码。 MongoDB也可以利用特殊集合db.system.js
来做到这一点,但不鼓励这样做:http://docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side
顺便说一下:MongoDB不是为存储过程设计的。通常建议在应用程序层上实现任何高级逻辑。不建议将存储过程实现甚至是微不足道的操作,例如有时在SQL数据库上完成的操作。
答案 1 :(得分: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