$expr(聚合表达式查询)
最后更新:2026-10-09
$expr(聚合表达式查询)
$expr 允许在查询条件中使用聚合表达式,比较同一文档内多个字段或调用聚合操作符。`{ $expr: { $gt: ['$price', '$cost'] } }` 查询售价高于成本的商品,$ 前缀引用字段值。注意:$expr 通常无法走索引(MongoDB 6.0 起部分场景可走索引),大集合慎用。
| 分类 | 元素与求值 |
|---|---|
| MongoDB 版本 | 3.6+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $expr: { <聚合表达式> } }
⚙️ 参数
| 聚合表达式 | 如 { $gt: ['$price', '$cost'] },$ 前缀引用字段值。 |
|---|
返回值:匹配的文档游标
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $expr:售价高于成本的商品
// $price 引用字段值,不是字符串
db.products.find({ $expr: { $gt: ['$price', '$cost'] } })
// 比较两个字段相等
db.users.find({ $expr: { $eq: ['$email', '$username'] } })
运行结果:
// 返回 price 大于 cost 的商品;email 与 username 相同的用户
📌 注意事项
- $ 前缀引用字段值,与聚合管道中语义一致
- 通常无法走索引;6.0 起部分表达式可走索引
- 能用普通查询表达的场景优先用普通操作符
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$expr 怎么比较同一文档的两个字段?
A用 $ 引用:{ $expr: { $gt: ['$price', '$cost'] } }。
Q$expr 能走索引吗?
A大多数情况下不能;MongoDB 6.0 起部分情况(如范围比较)可以走索引。
Q$expr 和 $where 有什么区别?
A$expr 用聚合表达式(推荐),$where 用 JavaScript(慢且无法走索引)。