Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在MongoDB中执行非阻塞评估读取_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Node.js 在MongoDB中执行非阻塞评估读取,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我从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没有这样的限制,但我

我从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服务器上运行这些存储过程而不阻塞所有内容?

您可以将字段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
来实现这一点,但不鼓励这样做:


顺便说一下:MongoDB不是为存储过程设计的。通常建议在应用层上实现任何高级逻辑。不鼓励将甚至是琐碎的操作作为存储过程来实现,就像有时在SQL数据库上实现一样。

您可以将字段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
来实现这一点,但不鼓励这样做:


顺便说一下:MongoDB不是为存储过程设计的。通常建议在应用层上实现任何高级逻辑。不鼓励将即使是琐碎的操作作为存储过程来实现,就像有时在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

这是将函数存储在服务器端并调用use的方法,如下所示:

 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

您应该指出,不鼓励使用db.system.js。摘录自:“注意:如果可能,我们不建议使用服务器端存储函数。”您应该指出,不鼓励使用db.system.js。摘录自:“注意:如果可能,我们不建议使用服务器端存储函数。”