$match(聚合)
定义
$match
根据指定的查询谓词过滤文档。匹配的文档将传递到下一个管道阶段。
兼容性
可以使用 $match
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
{ $match: { <query predicate> } }
行为
管道优化
尽可能早地将
$match
放在聚合管道中。由于$match
限制了聚合管道中的文档总数,因此早期的$match
操作会最大限度地减少管道中的处理量。如果在管道的开头放置一个
$match
,查询可以像使用任何其他db.collection.find()
或db.collection.findOne()
那样使用索引。
查询谓词中的表达式
0、Null、False 或缺失值
如果满足以下条件之一,则 $match
阶段会从管道结果中过滤掉文档:
$match
查询谓词返回该文档的0
、null
或false
值。$match
查询谓词使用了该文档中缺少的字段。
限制
您不能在
$match
阶段使用$where
。您不能在
$match
阶段中使用$near
或$nearSphere
。或者也可以:在
$match
阶段使用带有$center
或$centerSphere
的$geoWithin
查询谓词操作符。
要在
$match
阶段中使用$text
,$match
阶段必须是管道的第一阶段。视图不支持
$text
。注意
$text
提供自管理(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案 Atlas Search。
使用 Atlas Search 筛选 Atlas 数据
对于存储在MongoDB Atlas中的数据,您可以在运行 查询时使用Atlas Search复合操作符操作符 filter
$search
选项来匹配或过滤文档。在$match
$search
之后运行$search
的性能低于使用复合操作操作符filter
选项运行 的性能。
示例
这些示例会使用包含以下文档且名为 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
会选择 author
字段等于 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
选择 score
大于 70
但小于 90
或 views
大于或等于 1000
的文档。然后,这些文档通过管道传送到 $group
进行计数。该聚合返回以下内容:
{ "_id" : null, "count" : 5 }
本页上的C#示例使用Atlas示例数据集中的 sample_mflix
数据库。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅MongoDB .NET/ C#驱动程序文档中的入门。
以下 Movie
类对 sample_mflix.movies
集合中的文档进行建模:
public class Movie { public string Id { get; set; } public int Runtime { get; set; } public string Title { get; set; } public string Rated { get; set; } public List<string> Genres { get; set; } public string Plot { get; set; } public ImdbData Imdb { get; set; } public int Year { get; set; } public int Index { get; set; } public string[] Comments { get; set; } [ ] public DateTime LastUpdated { get; set; } }
要使用MongoDB .NET/ C#驾驶员将 $match
阶段添加到聚合管道,请对 PipelineDefinition
对象调用 Match() 方法。
以下示例创建一个管道阶段,用于匹配 Title
字段等于 "The Shawshank Redemption"
的所有 Movie
文档:
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(m => m.Title == "The Shawshank Redemption");
更多信息
有关聚合的更多信息和使用案例,请参阅以下页面。