$match(聚合)
定义
$match
根据指定的查询谓词筛选文档。匹配的文档传递到下一个管道阶段。
兼容性
您可以使用 $match
在以下环境中部署
MongoDB Atlas:云中MongoDB部署的完全托管服务
MongoDB Enterprise:基于订阅、自管理的MongoDB版本
MongoDB Community:源代码可用的、免费使用且可自管理的MongoDB版本
语法
{ $match: { <query predicate> } }
$match
查询谓词的语法与 find() 命令的查询参数 中使用的语法相同。
行为
管道优化
尽可能早地将
$match
放入聚合 管道。因为$match
限制了聚合管道中的文档总数,所以越早进行$match
操作,就越能最小化管道中需要处理的数据量。如果在管道的开始处放置一个
$match
,查询可以利用像其他db.collection.find()
或db.collection.findOne()
一样的 索引。
查询谓词中的表达式
0、空值、False 或缺失值
如果满足以下条件之一,$match
阶段将过滤掉管道结果中的一个文档:
$match
查询谓词在该文档上返回一个0
、null
或false
值。$match
查询谓词使用该文档中缺失的字段。
限制
在
$match
阶段中不能使用$where
。在
$match
阶段中不能使用$near
或$nearSphere
。作为替代,您可以选择:使用
$geoNear
阶段代替$match
阶段。在
$match
阶段中使用$geoWithin
查询谓词操作符与$center
或$centerSphere
。
要在
$match
阶段中使用$text
,则$match
阶段必须是管道的第一个阶段。视图 不支持
$text
。注意
$text
为自托管(非 Atlas)部署提供文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一个改进的全文查询解决方案,即 Atlas Search。
使用 Atlas Search 在 Atlas 上过滤数据
对于存储在 MongoDB Atlas 的数据,您可以使用 Atlas Search 复合 操作符 filter
选项来在执行 $search
查询时匹配或过滤文档。在 $search
后运行 $match
比使用复合操作符 filter
选项的 复合 操作符 filter 选项运行 $search
的性能低。
有关 filter
选项的更多信息,请参阅 Atlas 文档中的 复合。
示例
以下示例使用一个名为 articles
的集合,其中包含以下文档
{ "_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 }
等值匹配
以下操作使用 $match
来执行等值匹配
db.articles.aggregate( [ { $match : { author : "dave" } } ] );
$match
选择了作者字段等于 dave
的文档,聚合返回以下结果
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 } { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
执行计数
以下示例使用 $match
管道操作符选择要处理的文档,然后将结果传递给 $group
管道操作符以计算文档计数
db.articles.aggregate( [ { $match: { $or: [ { score: { $gt: 70, $lt: 90 } }, { views: { $gte: 1000 } } ] } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
在聚合管道中,$match
选择了分数大于 70
且小于 90
或观看次数大于或等于 1000
的文档。然后这些文档被传递到 $group
以执行计数。聚合返回以下结果
{ "_id" : null, "count" : 5 }
附加信息
请参考以下页面获取更多关于聚合的信息和使用案例。