- Application Development >
- Server-side JavaScript
Server-side JavaScript¶
On this page
MongoDB supports server-side execution of JavaScript code within the database process.
Note
The JavaScript code execution takes a JavaScript lock: each
mongod can only execute a single JavaScript operation at
a time.
You can disable all server-side execution of JavaScript, by passing
the --noscripting option on the
command line or setting noscripting in a configuration
file.
Map-Reduce¶
MongoDB performs the execution of JavaScript functions for Map-Reduce operations on the server. Within these JavaScript functions, you must not access the database for any reason, including to perform reads.
See the db.collection.mapReduce() and the
Map-Reduce documentation for more information,
including examples of map-reduce. See map-reduce concurrency section for concurrency information for
map-reduce.
eval Command¶
The eval command, and the corresponding mongo
shell method db.eval(), evaluates JavaScript functions on the
database server. This command may be useful if you need to touch a lot
of data lightly since the network transfer of the data could become a
bottleneck if performing these operations on the client-side.
Warning
By default, eval command requires a write lock. As
such eval will block all other read and write
operations while it runs. Because only a single JavaScript process
can run at a time, do not run mapReduce,
group, queries with the $where or any
other operation that requires JavaScript execution within
eval operations.
See eval command and db.eval() documentation for
more information, including examples.
Running .js files via a mongo shell Instance on the Server¶
Running a JavaScript (.js) file using a mongo shell
instance on the server is a good technique for performing batch
administrative work. When you run mongo shell on the
server, connecting via the localhost interface, the connection is fast
with low latency. Additionally, this technique has the advantage over
the eval command since the command eval
blocks all other operations.
$where Operator¶
To perform Read Operations, in addition to the standard
operators (e.g. $gt, $lt), with the
$where operator, you can also express the query condition
either as a string or a full JavaScript function that specifies a
SQL-like WHERE clause. However, use the standard operators whenever
possible since $where operations have significantly slower
performance.
Warning
Do not write to the database within the $where
JavaScript function.
See $where documentation for more information, including
examples.
Storing Functions Server-side¶
Note
We do not recommend using server-side stored functions if possible.
There is a special system collection named system.js that can store
JavaScript functions for reuse.
To store a function, you can use the db.collection.save(), as
in the following example:
- The
_idfield holds the name of the function and is unique per database. - The
valuefield holds the function definition
Once you save a function in the system.js collection, you can use
the function from any JavaScript context (e.g. eval, $where,
map-reduce).
Consider the following example from the mongo shell that
first saves a function named echoFunction to the system.js
collection and calls the function using db.eval():
See http://github.com/mongodb/mongo/tree/master/jstests/storefunc.js for a full example.
New in version 2.1: In the mongo shell, you can use
db.loadServerScripts() to load all the scripts saved in
the system.js collection for the current db. Once loaded, you
can invoke the functions directly in the shell, as in the following
example:
Concurrency¶
Refer to the individual method or operator documentation for any concurrency information. See also the concurrency table.