MongoDB聚合管道:$match

$match是聚合管道中最常用的阶段之一,用于过滤管道中的文档,只允许符合条件的文档进入到管道的下一阶段。

语法

js 复制代码
{$match:{<query>}}

使用举例

创建articles文档,并加入下面的数据

json 复制代码
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
{ "_id" : ObjectId("55f5a192d4bede9ac365b257"), "author" : "ahn", "score" : 60, "views" : 1000 }
{ "_id" : ObjectId("55f5a192d4bede9ac365b258"), "author" : "li", "score" : 55, "views" : 5000 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b259"), "author" : "annT", "score" : 60, "views" : 50 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b25a"), "author" : "li", "score" : 94, "views" : 999 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b25b"), "author" : "ty", "score" : 95, "views" : 1000 }

等式匹配

js 复制代码
匹配作者为"dave"的文档
db.articles.aggregate(
    [ { $match : { author : "dave" } } ]
);

管道输出结果:

json 复制代码
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }

计数

匹配评分在70分到90分之间或者阅读量大于1000的记录,并统计数量

js 复制代码
db.articles.aggregate( [
  { $match: { $or: [ { score: { $gt: 70, $lt: 90 } }, { views: { $gte: 1000 } } ] } },
  { $group: { _id: null, count: { $sum: 1 } } }
] );

管道输出结果:

json 复制代码
{ "_id" : null, "count" : 5 }

最佳实践

  • 应尽可能把$match放在管道的前面,这样可以最大程度的减少进入管道的文档数量,不仅可以减少内存的占用,也可以加快后续阶段的执行。
  • 如果$match放在管道的最前面,就能像find一样利用上索引了,执行效率会更高。

注意事项

  • $matchquery参数跟collection.find查询条件一样,只支持读取操作表达式,不支持原始聚合表达式,只能在$expr查询表达式中包含聚合表达式。比如:

    js 复制代码
    { $match: { $expr: { <aggregation expression> } } }
  • $match中,不能使用$where

  • $match中,不能使用$near$nearSphere,但是:

    • 可以使用$geoNeer替代match
    • $geoWithin可以与$center$centerSphere一起使用
  • 如果要在$match中使用$text,则必须要把$match放在聚合管道的第一个阶段。

内容参考MongoDB官方线上文档,错误纰漏之处请不吝指正。

相关推荐
风哥2号1 小时前
数据库教程FGMT52‑PostgreSQL用户权限与安全管理
数据库·postgresql
风哥2号7 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan8 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技9 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m9 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
风哥2号11 小时前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录12 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶13 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea13 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
probex_14 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库