On this page
db.eval()
在本页面
Definition
db.
eval
(* function , arguments *)- 从 3.0 版开始不推荐使用。
提供在 MongoDB 服务器上运行 JavaScript 代码的功能。
mongoShell 程序中的帮助程序db.eval()包装了eval命令。因此,helper 方法具有一个 exception*共享基础命令的特性和行为:db.eval()方法不支持nolock
选项。
该方法接受以下参数:
Parameter | Type | Description |
---|---|---|
function |
function | 要执行的 JavaScript 函数。 |
arguments |
list | 可选的。传递给 JavaScript 函数的参数列表。如果函数不带参数,则省略。 |
JavaScript 函数不需要像第一个示例中那样带任何参数,也可以选择像第二个例子中那样带参数:
function () {
// ...
}
function (arg1, arg2) {
// ...
}
Behavior
您必须对副本集的primary成员运行db.eval()。如果您尝试在secondary成员上运行db.eval(),则 MongoDB 将返回错误。
Write Lock
默认情况下,db.eval()在评估 JavaScript 函数时会采用全局写锁定。结果,在db.eval()操作运行时,db.eval()阻止了对数据库的所有其他读取和写入操作。
为了防止在评估 JavaScript 代码时获取全局写锁定,请使用eval * command *,并将nolock
设置为true
。 nolock
不会影响 JavaScript 代码中的操作是否带有写锁。
对于长时间运行的db.eval()操作,请考虑将 eval 命令与nolock: true
一起使用或使用其他服务器端代码执行选项。
Sharded Data
Access Control
在 2.6 版中进行了更改。
如果启用了授权,则必须有权访问所有资源上的所有操作才能运行eval。不建议提供这种访问权限,但是如果您的组织要求用户运行eval,请创建一个在anyResource上授予anyAction的角色。不要将此角色分配给任何其他用户。
Examples
以下是db.eval()方法的示例:
db.eval( function(name, incAmount) {
var doc = db.myCollection.findOne( { name : name } );
doc = doc || { name : name , num : 0 , total : 0 , avg : 0 };
doc.num++;
doc.total += incAmount;
doc.avg = doc.total / doc.num;
db.myCollection.save( doc );
return doc;
},
"eliot", 5 );
函数中的
db
引用当前数据库。"eliot"
是传递给函数的参数,与name
参数对应。5
是该函数的参数,并且对应于incAmount
字段。
如果要使用服务器的解释器,则必须运行db.eval()。否则,mongo shell 的 JavaScript 解释器将评估直接 Importing 到该 shell 中的函数。
如果发生错误,则db.eval()引发异常。下面是一个无效函数的示例,该函数使用变量x
而不将其声明为参数:
db.eval( function() { return x + x; }, 3 );
该语句导致以下异常:
{
"errmsg" : "exception: JavaScript execution failed: ReferenceError: x is not defined near '{ return x + x; }' ",
"code" : 16722,
"ok" : 0
}
See also