1

我想出了如何从 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()发出写锁,因此没有其他东西可以读取或写入数据库。我不要那个。

它还说eval没有这样的限制,但我不知道在哪里可以找到它。从他们谈论它的方式来看,似乎常规eval仅在 mongo shell 中可用,而不是从客户端。

那么:如何在不阻塞所有内容的情况下在 mongodb 服务器上运行这些存储过程?

4

2 回答 2

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 设置强制写锁,但不会阻止函数内部的任何操作自行创建写锁。

来源:文档

请注意,在这种情况下,术语“存储过程”是错误的。存储过程是指存储在数据库本身而不由应用层交付的代码。MongoDB 也可以使用特殊集合db.system.js来执行此操作,但不鼓励这样做:http: //docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side

顺便说一句:MongoDB 不是为存储过程设计的。通常建议在应用层实现任何高级逻辑。不鼓励将即使是微不足道的操作实现为存储过程的做法,就像有时在 SQL 数据库上所做的那样。

于 2013-03-27T20:20:49.457 回答
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
于 2013-03-27T20:32:25.343 回答