首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MongoDB中执行非阻塞的eval读取。

问在MongoDB中执行非阻塞的eval读取。
EN

Stack Overflow用户
提问于 2013-03-27 20:03:04
回答 2查看 1.3K关注 0票数 1

我想出了如何在MongoDB服务器上运行node.js客户端的javascript代码。

代码语言: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中可用,而不是从客户端。

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

EN

回答 2

Stack Overflow用户

发布于 2013-03-27 20:20:49

可以将字段nolock设置为true的对象作为可选的第三个参数传递给eval:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-27 20:32:25

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

代码语言:javascript
复制
 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15668332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档