对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

$where(查询谓词运算操作符)

$where

使用$where 操作符将包含JavaScript表达式或完整JavaScript函数的字符串传递给查询系统。$where 提供了更高的灵活性,但要求数据库为集合中的每个文档处理JavaScript表达式或函数。使用 或 在JavaScript表达式或函数中引用该文档。thisobj

可以使用 $where 查找托管在以下环境中的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

$where操作符具有以下形式:

{ $where: <string|JavaScript Code> }

注意

$where不再支持已弃用的具有作用域的BSON类型JavaScript代码(BSON类型 15)。$where 操作符仅支持BSON类型字符串(BSON类型2 )或BSON类型JavaScript (BSON类型13 )。自MongoDB.. 起,已弃用使用具有$where 作用域的BSON类型JavaScript。421

注意

聚合替代方案优于

$expr 操作符允许在查询语言中使用聚合表达式。如果所提供的管道操作符无法满足应用程序的需要,$function$accumulator 允许用户在 JavaScript 中定义自定义聚合表达式。

给定可用的聚合操作符:

  • $expr将 与不使用JavaScript 的聚合操作符(即非$function 和非$accumulator 操作符)一起使用比$where 更快,因为它不执行JavaScript ,因此应尽可能作为首选。

  • 但是,如果必须创建自定义表达式,则$function 优于$where

map-reduce operations$where 操作符表达式无法访问权限 中提供的某些全局函数或属性,例如db mongosh

以下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()

仅将$where 查询运算符应用顶级文档。$where 查询运算符在嵌套文档中不起作用,实例在$elemMatch 查询中。

  • 请勿使用全局变量。

  • $where会评估JavaScript ,无法利用索引。因此,使用标准MongoDB操作符(例如$gt$in )来表达查询时,查询性能会提高。

  • 一般来说,只有当无法使用其他操作符表达查询时,才应使用$where 。如果必须使用$where ,请尝试包含至少一个其他标准查询运算符来过滤结果设立。单独使用$where 需要进行集合扫描。

使用普通的非$where 查询语句具有以下性能优势:

要使用$where (或$function $accumulator、 或mapReduce ),您必须启用服务器端脚本(默认)。

但是,如果不使用这些操作,请禁用服务器端脚本:

另请参阅 ➤使用安全配置选项运行 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" }
])

以下示例使用$wherehex_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"
} } } )

如果必须创建自定义表达式,$function 优于$where