Docs 主页 → 开发应用程序 → MongoDB Manual
$where
定义
兼容性
可以使用 $where
查找托管在以下环境中的部署:
MongoDB Atlas :用于在云中部署 MongoDB 的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$where
操作符具有以下形式:
{ $where: <string|JavaScript Code> }
注意
注意
聚合替代方案优于
$expr
操作符允许在查询语言中使用 聚合表达式 。如果提供的 管道操作符$function
无法满足应用程序的需求,则 和$accumulator
允许用户在 JavaScript 中定义自定义聚合表达式。
给定可用的聚合操作符:
将
$expr
与不使用 JavaScript 的聚合操作符(即非$function
和非$accumulator
操作符)一起使用比$where
更快,因为它不执行 JavaScript,因此应尽可能作为首选。但是,如果必须创建自定义表达式,则
$function
比$where
更可取。
行为
可用 JavaScript 属性和函数
map-reduce operations
和$where
操作符表达式无法访问 mongosh
中提供的某些全局函数或属性,例如db
。
以下 JavaScript 函数和属性可用于map-reduce operations
和$where
运算符表达式:
可用属性 | 可用函数 | |
---|---|---|
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
仅将$where
查询运算符应用于顶级文档。 $where
查询运算符在嵌套文档中不起作用,例如在$elemMatch
查询中。
考虑因素
请勿使用全局变量。
$where
会评估 JavaScript,无法利用索引。因此,使用标准 MongoDB 操作符(例如$gt
、$in
)来表达查询时,查询性能会提高。一般来说,只有当无法使用其他运算符表达查询时,才应使用
$where
。如果必须使用$where
,请尝试包含至少一个其他标准查询运算符来筛选结果集。单独使用$where
需要进行集合扫描。
使用普通的非$where
查询语句具有以下性能优势:
Javascript 启用
要使用$where
(或$function
、 $accumulator
或mapReduce
),必须启用服务器端脚本(默认)。
但是,如果不使用这些操作,请禁用服务器端脚本:
对于
mongod
实例,请参阅security.javascriptEnabled
配置选项或--noscripting
命令行选项。对于
mongos
实例,请参阅security.javascriptEnabled
配置选项或--noscripting
命令行选项。
另请参阅 ➤使用安全配置选项运行 MongoDB。
例子
以 players
集合中的以下文档为例:
db.players.insertMany([ { _id: 12378, name: "Steve", username: "steveisawesome", first_login: "2017-01-01" }, { _id: 2, name: "Anya", username: "anya", first_login: "2001-02-02" } ])
以下示例使用$where
和hex_md5()
JavaScript 函数将name
字段的值与 MD 5哈希进行比较,并返回所有匹配的文档。
db.players.find( { $where: function() { return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994") } } );
操作返回以下结果:
{ "_id" : 2, "name" : "Anya", "username" : "anya", "first_login" : "2001-02-02" }
作为替代方案,可以使用$expr
和$function
重写前面的示例。您可以使用聚合运算符$function
在 JavaScript 中定义自定义聚合表达式。要访问$function
和db.collection.find()
中的其他聚合操作符,请与$expr
一起使用:
db.players.find( {$expr: { $function: { body: function(name) { return hex_md5(name) == "9b53e667f30cd329dca1ec9e6a83e994"; }, args: [ "$name" ], lang: "js" } } } )