On this page
$where
On this page
Definition
$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
.
Important
Changed in version 3.6: The $expr
operator allows the use of aggregation expressions within the query language. $expr
is faster than $where
because it does not execute JavaScript and should be preferred where possible.
Behavior
Restrictions
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.
The following JavaScript functions and properties are available to map-reduce operations
, the group
command, and $where
operator expressions:
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
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:
Example
Consider the following documents in the players
collection:
{
_id: 12378,
name: "Steve",
username: "steveisawesome",
first_login: "2017-01-01"
}
{
_id: 2,
name: "Anya",
username: "anya",
first_login: "2001-02-02"
}
The following example uses $where
and the hex_md5()
JavaScript function to compare the value of the name
field to an MD5 hash and returns any matching document.
db.players.find( { $where: function() {
return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994")
} } );
The operation returns the following result:
{
"_id" : 2,
"name" : "Anya",
"username" : "anya",
"first_login" : "2001-02-02"
}