文档菜单
文档首页
/
MongoDB 手册
/ / / /

$where

本页

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 可用的JavaScript属性和函数
  • elemMatch
  • 注意事项
  • JavaScript启用
  • 不支持数组和字符串函数
  • 示例
$where

重要

服务器端JavaScript已弃用

从MongoDB 8.0开始,服务器端JavaScript函数($accumulator$function$where)已被弃用。当您运行这些函数时,MongoDB会记录一条警告。

使用$where运算符来传递包含JavaScript表达式的字符串或完整的JavaScript函数。与$where相比,它提供了更大的灵活性,但需要数据库处理集合中的每个文档的JavaScript表达式或函数。使用thisobj在JavaScript表达式或函数中引用文档。

您可以在以下环境中使用 $where 部署

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

$where 操作符具有以下形式

{ $where: <string|JavaScript Code> }

注意

$where 操作符不再支持已弃用的带有范围的 BSON 类型 JavaScript 代码(BSON 类型 15)。$where 操作符仅支持 BSON 类型 String(BSON 类型 2)或 BSON 类型 JavaScript(BSON 类型 13)。从 MongoDB 4.2.1 开始,已弃用带有范围的 BSON 类型 JavaScript 用于 $where

注意

优先考虑聚合替代方案

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

给定可用的聚合操作符

  • 使用不涉及JavaScript的聚合运算符(即非$function$accumulator运算符)的$expr,其速度比使用$where快,因为它不需要执行JavaScript,如果可能的话,应优先使用。

  • 然而,如果您必须创建自定义表达式,则比使用$where更推荐使用$function

map-reduce操作$where运算符表达式无法访问某些全局函数或属性,例如在mongosh中可用的db

以下JavaScript函数和属性在map-reduce操作$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()
时间戳()
tojson()
tojsononeline()
tojsonObject()
UUID()
版本号()

仅将 $where 查询运算符应用于顶层文档。在嵌套文档内部,例如在 $elemMatch 查询中,$where 查询运算符将不起作用。

  • 不要使用全局变量。

  • $where 评估 JavaScript 并且无法利用索引。因此,当您使用标准的 MongoDB 操作符(例如,$gt$in)表达查询时,查询性能会得到提升。

  • 一般来说,您应该只在无法使用其他运算符表达查询时才使用 $where。如果您必须使用 $where,则尝试包含至少一个其他标准查询运算符以过滤结果集。单独使用 $where 需要集合扫描。

使用常规非 $where 查询语句提供以下性能优势

  • MongoDB将在执行$where语句之前评估查询中非$where的部分。如果非$where语句没有匹配任何文档,MongoDB将不会使用$where进行任何查询评估。

  • $where查询语句可以使用索引。

要使用$where(或$function$accumulatormapReduce),您必须启用服务器端脚本(默认设置)。

然而,如果您不使用这些操作,请禁用服务器端脚本

另请参阅➤ 使用安全配置选项运行MongoDB。

MongoDB 6.0 版本升级了用于服务器端 JavaScript$accumulator$function$where表达式所使用的内部JavaScript引擎,从MozJS-60升级到MozJS-91。在MozJS-60中存在的几个已弃用、非标准的数组和字符串函数在MozJS-91中被移除。

有关移除的数组和字符串函数的完整列表,请参阅6.0 兼容性说明。

考虑以下位于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中定义自定义聚合表达式。要访问$function和其他聚合操作符,请在db.collection.find()中使用$expr

db.players.find( {$expr: { $function: {
body: function(name) { return hex_md5(name) == "9b53e667f30cd329dca1ec9e6a83e994"; },
args: [ "$name" ],
lang: "js"
} } } )

如果您必须创建自定义表达式,则首选使用$function而不是$where

返回

$regex