db.eval()

在本页面

Definition

  • db. eval(* function arguments *)
    • 从 3.0 版开始不推荐使用。

提供在 MongoDB 服务器上运行 JavaScript 代码的功能。

mongoShell 程序中的帮助程序db.eval()包装了eval命令。因此,helper 方法具有一个 exception*共享基础命令的特性和行为:db.eval()方法不支持nolock选项。

该方法接受以下参数:

ParameterTypeDescription
functionfunction要执行的 JavaScript 函数。
argumentslist可选的。传递给 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设置为truenolock不会影响 JavaScript 代码中的操作是否带有写锁。

对于长时间运行的db.eval()操作,请考虑将 eval 命令与nolock: true一起使用或使用其他服务器端代码执行选项

Sharded Data

您不能将db.eval()sharded集合一起使用。通常,应避免在sharded clusters中使用db.eval();但是,可以将db.eval()与未分片的集合和存储在sharded cluster中的数据库一起使用。

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
}