eval¶
-
eval¶ The
evalcommand evaluates JavaScript functions on the database server and has the following form:The command contains the following fields:
Field Type Description evalfunction A JavaScript function. argsarray Optional. An array of arguments to pass to the JavaScript function. Omit if the function does not take arguments. nolockboolean Optional. By default, evaltakes a global write lock before evaluating the JavaScript function. As a result,evalblocks all other read and write operations to the database while theevaloperation runs. Setnolocktotrueon theevalcommand to prevent theevalcommand from taking the global write lock before evaluating the JavaScript.nolockdoes not impact whether operations within the JavaScript code itself takes a write lock.JavaScript in MongoDB
Although
evaluses JavaScript, most interactions with MongoDB do not use JavaScript but use an idiomatic driver in the language of the interacting application.
Behavior¶
Write Lock¶
By default, eval takes a global write lock while evaluating the
JavaScript function. As a result, eval blocks all other read and
write operations to the database while the eval operation runs.
To prevent the taking of the global write lock while evaluating the
JavaScript code, use the eval command with nolock set to
true. nolock does not impact whether the operations within the
JavaScript code take write locks.
For long running eval operation, consider using either the
eval command with nolock: true or using other
server side code execution options.
Sharded Data¶
You can not use eval with sharded collections.
In general, you should avoid using eval in sharded clusters; nevertheless, it is possible to use eval with
non-sharded collections and databases stored in a sharded
cluster.
Access Control¶
With authentication enabled, eval will fail
during the operation if you do not have the permission to perform a
specified task.
Changed in version 2.4: You must have full admin access to run.
Example¶
The following example uses eval to
perform an increment and calculate the average on the server:
The db in the function refers to the current database.
The mongo shell provides a helper method
db.eval() [1], so you can express the
above as follows:
If you want to use the server’s interpreter, you must run
eval. Otherwise, the mongo shell’s
JavaScript interpreter evaluates functions entered directly into the
shell.
If an error occurs, eval throws an exception.
The following invalid function uses the variable x without
declaring it as an argument:
The statement will result in the following exception:
See also
| [1] | The helper db.eval() in the mongo shell wraps the
eval command. Therefore, the helper method shares the
characteristics and behavior of the underlying command with one
exception: db.eval() method does not support the nolock
option. |