Docs 菜单
Docs 主页
/
数据库手册
/ / /

$match(聚合)

$match

根据指定的查询谓词过滤文档。匹配的文档将传递到下一个管道阶段。

可以使用 $match 查找托管在以下环境中的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

{ $match: { <query predicate> } }

$match 查询谓词的语法与 find() 命令的查询参数中使用的语法相同。

要在查询谓词中包含表达式,请使用 $expr 操作符。

如果满足以下条件之一,则 $match 阶段会从管道结果中过滤掉文档:

  • $match查询谓词返回该文档的 0nullfalse 值。

  • $match查询谓词使用了该文档中缺少的字段。

  • 您不能在 $match 阶段使用 $where

  • 您不能在 $match 阶段中使用 $near$nearSphere。或者也可以:

  • 要在 $match 阶段中使用 $text$match 阶段必须是管道的第一阶段。

    视图不支持 $text

    注意

    $text 提供自管理(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案 Atlas Search

对于存储在 MongoDB Atlas 中的数据,在运行 $search 查询时,您可以使用 Atlas Search 复合操作符 filter 选项来匹配或过滤文档。在 $search 之后运行 $match 的性能低于使用复合操作符 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 会选择 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 但小于 90views 大于或等于 1000 的文档。然后,这些文档通过管道传送到 $group 进行计数。该聚合返回以下内容:

{ "_id" : null, "count" : 5 }

本页上的C#示例使用Atlas示例数据集中的 sample_mflix数据库。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅MongoDB .NET/ C#驱动程序文档中的入门

以下 Movie 类对 sample_mflix.movies 集合中的文档进行建模:

public class Movie
{
public ObjectId 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; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

注意

用于 Pascal Case 的 ConventionPack

本页面上的 C# 类使用 Pascal 大小写为属性命名,但 MongoDB 集合中的字段名称使用小驼峰式命名法。为了解决这一差异,您可以在应用程序启动时使用以下代码注册 ConventionPack

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

要使用MongoDB .NET/ C#驾驶员将 $match 阶段添加到聚合管道,请对 PipelineDefinition对象调用 Match() 方法。

以下示例创建一个管道阶段,用于匹配 Title字段等于 "The Shawshank Redemption" 的所有 Movie 文档:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Match(m => m.Title == "The Shawshank Redemption");

本页上的 Node.jssample_mflix 示例使用Atlas示例数据集中的 数据库。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅MongoDB Node.js驾驶员文档中的入门。

要使用MongoDB Node.js驾驶员将 $match 阶段添加到聚合管道,请在管道对象中使用 $match操作符。

以下示例创建了一个管道阶段,用于匹配 title字段等于 "The Shawshank Redemption" 的所有 movie 文档。然后,该示例运行聚合管道:

const pipeline = [
{
$match: {
title: "The Shawshank Redemption"
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

请参阅完整聚合管道教程,以获取有关聚合的更多信息和使用案例。

后退

$lookup

获得技能徽章

免费掌握“数据转换基础”!

了解详情

在此页面上