$match(过滤文档)
最后更新:2026-10-09
$match(过滤文档)
$match 是聚合管道的第一个阶段,用查询条件过滤文档,只让匹配的文档进入后续阶段。它等价于普通 find() 的查询条件,但只能在聚合管道中使用。尽可能把 $match 放在管道最前面——它能利用索引并减少进入后续阶段的文档量,是聚合性能优化的第一原则。
| 分类 | 核心阶段 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $match: { <查询条件> } }
⚙️ 参数
| 查询条件 | 与 find() 相同的查询表达式,支持比较/逻辑/元素等查询操作符。 |
|---|
返回值:过滤后的文档流(供下一阶段)
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $match:只统计 status 为 A 的订单
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
运行结果:
// 返回每个客户的订单总额
{ "_id": "A123", "total": 250 }
{ "_id": "B456", "total": 130 }
📌 注意事项
- $match 尽量前置,可利用索引(首阶段可直接用索引)
- 不能在 $match 中使用 $where、$text(文本查询须是首个阶段)
- $match 之后管道无法再用集合扫描索引优化
🏷️ 相关标签
💡 相关案例
聚合管道进阶:复杂表达式与转换
聚合管道入门:aggregate方法与基础阶段
Change Streams:实时变更监听
$facet + $bucket + 文本/地理空间搜索
$lookup与多集合关联
mongoose模型与Schema设计
📚 相关教程
❓ 常见问题
Q$match 和 find() 有什么区别?
A功能上查询条件完全一样,但 $match 只能在聚合管道中使用,且结果会作为文档流传给下一阶段。
Q$match 能放在管道中间吗?
A可以,但会失去索引优化优势。经验法则:能前置就前置。
Q$match 放在管道开头有什么好处?
A尽早过滤文档能减少后续阶段处理的数据量,且 $match 能利用索引,显著提升聚合性能。若放中间仍可工作但无法利用索引。