$where¶
On this page
-
$where
¶ Use the
$where
operator to pass either a string containing a JavaScript expression or a full JavaScript function to the query system. The$where
provides greater flexibility, but requires that the database processes the JavaScript expression or function for each document in the collection. Reference the document in the JavaScript expression or function using eitherthis
orobj
.
Behavior¶
Restrictions¶
Changed in version 2.4.
In MongoDB 2.4, map-reduce operations
, the
group
command, and $where
operator expressions
cannot access certain global functions or properties, such as
db
, that are available in the mongo
shell.
When upgrading to MongoDB 2.4, you will need to refactor your code if
your map-reduce operations
, group
commands, or $where
operator expressions include any global
shell functions or properties that are no longer available, such as
db
.
The following JavaScript functions and properties are available to
map-reduce operations
, the group
command, and $where
operator expressions in MongoDB 2.4:
Available Properties | Available Functions | |
---|---|---|
args MaxKey MinKey |
assert() BinData() DBPointer() DBRef() doassert() emit() gc() HexData() hex_md5() isNumber() isObject() ISODate() isString() |
Map() MD5() NumberInt() NumberLong() ObjectId() print() printjson() printjsononeline() sleep() Timestamp() tojson() tojsononeline() tojsonObject() UUID() version() |
elemMatch
¶
Changed in version 2.6.
Only apply the $where
query operator to top-level
documents. The $where
query operator will not work inside a
nested document, for instance, in an $elemMatch
query.
Considerations¶
- Do not use global variables.
$where
evaluates JavaScript and cannot take advantage of indexes. Therefore, query performance improves when you express your query using the standard MongoDB operators (e.g.,$gt
,$in
).- In general, you should use
$where
only when you can’t express your query using another operator. If you must use$where
, try to include at least one other standard query operator to filter the result set. Using$where
alone requires a collection scan.
Using normal non-$where
query statements provides the
following performance advantages:
- MongoDB will evaluate non-
$where
components of query before$where
statements. If the non-$where
statements match no documents, MongoDB will not perform any query evaluation using$where
. - The non-
$where
query statements may use an index.
Examples¶
Consider the following examples:
db.myCollection.find( { $where: "this.credits == this.debits" } );
db.myCollection.find( { $where: "obj.credits == obj.debits" } );
db.myCollection.find( { $where: function() { return (this.credits == this.debits) } } );
db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
Additionally, if the query consists only of the $where
operator, you can pass in just the JavaScript expression or
JavaScript functions, as in the following examples:
db.myCollection.find( "this.credits == this.debits || this.credits > this.debits" );
db.myCollection.find( function() { return (this.credits == this.debits || this.credits > this.debits ) } );
You can include both the standard MongoDB operators and the
$where
operator in your query, as in the following
examples:
db.myCollection.find( { active: true, $where: "this.credits - this.debits < 0" } );
db.myCollection.find( { active: true, $where: function() { return obj.credits - obj.debits < 0; } } );