$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 }

📌 注意事项

📚 相关教程

❓ 常见问题

Q$match 和 find() 有什么区别?
A功能上查询条件完全一样,但 $match 只能在聚合管道中使用,且结果会作为文档流传给下一阶段。
Q$match 能放在管道中间吗?
A可以,但会失去索引优化优势。经验法则:能前置就前置。
Q$match 放在管道开头有什么好处?
A尽早过滤文档能减少后续阶段处理的数据量,且 $match 能利用索引,显著提升聚合性能。若放中间仍可工作但无法利用索引。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏