对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

$match(聚合阶段)

$match

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

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

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
{ $match: { <query predicate> } }

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

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

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

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

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

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

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

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

    视图不支持 $text

    注意

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

对于存储在MongoDB Atlas中的数据,您可以在运行 查询时使用Atlas Search复合 filter$searchOperator操作符$search 选项来匹配或过滤文档。在$match $search之后运行 的性能低于使用复合操作操作符filter 选项运行 的性能。

要了解有关 filter 选项的更多信息,请参阅 Atlas 文档中的复合操作符

本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

以下操作使用$matchrated 字段执行等值匹配。runtime 过滤将结果限制为一个小的、有代表性的设立:

db.movies.aggregate(
[ { $match : { rated : "TV-PG", runtime : { $gt: 1000 } } } ]
)

$match选择 字段等于rated "TV-PG"runtime 大于1000 的文档。

以下示例使用$match 管道操作符选择要进程的文档,然后将结果通过管道传递给$group 管道操作符以计算文档数:

db.movies.aggregate( [
{ $match: { $or: [
{ runtime: { $gt: 1000 } },
{ year: { $lt: 1910 } }
] } },
{ $group: { _id: null, count: { $sum: 1 } } }
] )
[ { _id: null, count: 6 } ]

在聚合管道中,$match 选择runtime 大于1000year 早于1910 的文档。然后,将这些文档发送到$group 进行计数。

要根据数组字段中的元素过滤 document,在 $match 阶段的查询谓词中使用 $elemMatch 操作符:

db.aggregate( [
{
$documents: [
{ student_id: 1, scores: [ 0.75, 0.65, 0.73 ] },
{ student_id: 2, scores: [ 0.9, 0.88, 0.98 ] },
{ student_id: 3, scores: [ 0.9, 0.84, 0.93 ] }
]
}, {
$match: {
scores: { $elemMatch: { $gte: 0.9 } }
}
}
] )
[
{ student_id: 2, scores: [ 0.9, 0.88, 0.98 ] },
{ student_id: 3, scores: [ 0.9, 0.84, 0.93 ] }
]

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

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

[BsonIgnoreExtraElements]
public class Movie
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("title")]
public string Title { get; set; } = null!;
[BsonElement("year")]
public int? Year { get; set; }
[BsonElement("runtime")]
public int? Runtime { get; set; }
[BsonElement("rated")]
public string? Rated { get; set; }
[BsonElement("metacritic")]
public int Metacritic { get; set; }
[BsonElement("plot")]
public string? Plot { get; set; }
[BsonElement("type")]
public string? Type { get; set; }
[BsonElement("cast")]
public string[]? Cast { get; set; }
[BsonElement("directors")]
public string[]? Directors { get; set; }
[BsonElement("writers")]
public string[]? Writers { get; set; }
[BsonElement("imdb")]
public ImdbData? Imdb { get; set; }
}

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

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

var pipeline = new EmptyPipelineDefinition<Movie>()
.Match(m => m.Title == "The Godfather");
{ "_id" : "...", "title" : "The Godfather", "metacritic" : 100, "rated" : "R", "runtime" : 175, "imdb" : "..." }

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

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

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

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

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