Docs 菜单

Docs 主页开发应用程序MongoDB Manual

$where

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 可用 JavaScript 属性和函数
  • elemMatch
  • 考虑因素
  • Javascript 启用
  • 例子
$where

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

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

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

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

{ $where: <string|JavaScript Code> }

注意

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

注意

聚合替代方案优于

$expr操作符允许在查询语言中使用 聚合表达式 。如果提供的 管道操作符$function 无法满足应用程序的需求,则 和$accumulator 允许用户在 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()

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

  • 请勿使用全局变量。

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

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

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

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

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

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

以下示例使用$wherehex_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 中定义自定义聚合表达式。要访问$functiondb.collection.find()中的其他聚合操作符,请与$expr一起使用:

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

如果必须创建自定义表达式,则首选$function而非$where

← $text