定义
兼容性
可以使用 $where 查找托管在以下环境中的部署:
- MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$where操作符具有以下形式:
{ $where: <string|JavaScript Code> }
注意
$where不再支持已弃用的具有作用域的BSON类型JavaScript代码(BSON类型 15)。$where 操作符仅支持BSON类型字符串(BSON类型2 )或BSON类型JavaScript (BSON类型13 )。自MongoDB.. 起,已弃用使用具有$where 作用域的BSON类型JavaScript。421
行为
可用 JavaScript 属性和函数
map-reduce operations和$where 操作符表达式无法访问权限 中提供的某些全局函数或属性,例如db mongosh。
以下JavaScript函数和属性可用于 map-reduce operations和$where 操作符表达式:
可用属性 | 可用函数 | |
|---|---|---|
|
|
|
elemMatch
仅将$where 查询运算符应用顶级文档。$where 查询运算符在嵌套文档中不起作用,实例在$elemMatch 查询中。
Considerations
请勿使用全局变量。
使用普通的非$where 查询语句具有以下性能优势:
MongoDB将在 语句之前评估查询的非
$where$where组件。如果非 语句不匹配任何文档,$whereMongoDB将不会使用$where执行任何查询评估。
JavaScript Enablement
要使用$where (或$function $accumulator、 或mapReduce ),您必须启用服务器端脚本(默认)。
但是,如果不使用这些操作,请禁用服务器端脚本:
对于
mongod实例,请参阅security.javascriptEnabled配置选项或--noscripting命令行选项。对于
mongos实例,请参阅security.javascriptEnabled配置选项或--noscripting命令行选项。
另请参阅 ➤使用安全配置选项运行 MongoDB。
不支持的数组与字符串函数
MongoDB6.0 升级用于服务器端JavaScript 、 、$accumulator $function和$where 表达式的内部JavaScript引擎,并从 MozJS-60 升级到 MozJS-91 。 MozJS- 中存在的几个已弃用的非标准大量和字符串函数已在60 MozJS-91 中删除。
例子
以 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 MD5 哈希进行比较,并返回所有匹配的文档。
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 中定义自定义聚合表达式。要访问 db.collection.find() 中的 $function 和其他聚合操作符,请与 $expr 一起使用:
db.players.find( {$expr: { $function: { body: function(name) { return hex_md5(name) == "9b53e667f30cd329dca1ec9e6a83e994"; }, args: [ "$name" ], lang: "js" } } } )