$where(JS 表达式查询)
最后更新:2026-10-09
$where(JS 表达式查询)
$where 用 JavaScript 表达式作为查询条件。`{ $where: 'this.credits == this.debits' }`。表达式在服务器端执行,速度慢、无法走索引,官方建议优先用 $expr 替代。仅当 $expr 无法表达(如调用自定义 JS 函数)时才使用,且要防范注入风险。
| 分类 | 元素与求值 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $where: <JavaScript表达式> }
⚙️ 参数
| JS表达式 | 返回布尔值的 JavaScript 表达式,this 指向当前文档。 |
|---|
返回值:匹配的文档游标
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $where:借项等于贷项的记录(JS 写法)
db.accounts.find({ $where: 'this.credits == this.debits' })
// 推荐替代:$expr 更高效
db.accounts.find({ $expr: { $eq: ['$credits', '$debits'] } })
运行结果:
// 两者返回相同结果,但 $expr 性能更好
📌 注意事项
- 服务器端执行 JS,无法走索引,性能差
- 优先用 $expr 替代(MongoDB 3.6+)
- 注意注入风险:不要把用户输入直接拼进 $where
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$where 为什么慢?
A它在服务器端逐文档执行 JavaScript,无法利用索引,每条文档都要解释执行。
Q$where 和 $expr 怎么选?
A优先 $expr:性能好且支持索引;$where 只在需要自定义 JS 逻辑时用。
Q$where 有安全风险吗?
A有。若把用户输入拼接进字符串会触发注入攻击,务必参数化或改用 $expr。