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

$match(聚合阶段)

$match

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

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

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

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

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

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

  • $match查询谓词返回该文档的 0、null 或 false 值。

  • $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 文档中的复合操作符。

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

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

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

The $match selects the documents where the rated字段等于 "TV-PG" 且 runtime 大于 1000 的document。

以下示例使用 $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 大于 1000 或 year 早于 1910 的document。然后,这些 document 会发送到 $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 ] }]

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