在MongoDB中执行非阻塞评估读取

我想通过node.js客户端在MongoDB服务器上运行javascript代码:

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

这工作正常。 但是文档说db.eval()发出一个写locking,所以没有别的东西可以读取或写入数据库。 我不要那个。

它也说eval没有这个限制,但是我不知道在哪里find它。 从他们谈论的方式来看,似乎普通的eval只能在mongo shell中使用,而不能在客户端使用。

所以:我怎样才能在mongodb服务器上运行这些存储过程而不阻塞一切?

你可以传递一个字段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设置强制性写锁,但是它不会阻止函数内部的任何操作自行创build写锁。

来源: 文件 。

请注意,在这种情况下,术语“存储过程”是错误的。 存储过程是指存储在数据库本身而不是由应用程序层传送的代码。 MongoDB也可以使用特殊集合db.system.js来做到这db.system.js ,但是这样做是不鼓励的: http : db.system.js

顺便说一下:MongoDB不是为存储过程devise的。 通常build议在应用层上实现任何高级逻辑。 作为存储过程执行甚至微不足道的操作的做法,例如有时在SQL数据库上完成,是不鼓励的。

这是在服务器端存储你的函数的方式,你可以使用它,如下所示:

  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