$match(聚合)

在本页面

  • 定义

  • 行为

  • 例子

定义

  • $match

    • 过滤文档以仅将 match 指定 condition(s 的文档传递到下一个管道阶段。

$match阶段具有以下原型形式:

{ $match: { <query> } }

$match采用指定查询条件的文档。查询语法与读操作查询语法相同; i.e。 $match不接受原始聚合表达式。相反,使用$expr查询表达式在$match中包含聚合表达式。

行为

管道优化

  • 尽可能早地将$match放在聚合管道中。因为$match限制了聚合管道中的文档总数,所以之前的$match操作可以最大限度地减少管道的处理量。

  • 如果在管道的最开头放置$match,则查询可以像任何其他db.collection.find()或db.collection.findOne()一样利用索引。

限制

  • $match查询语法与读操作查询语法相同; i.e。 $match不接受原始聚合表达式。要在$match中包含聚合表达式,请使用$expr查询表达式:
{ $match: { $expr: { <aggregation expression> } } }
  • 您不能在$match查询中使用$where作为聚合管道的一部分。

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

查看不支持文本搜索。

例子

这些示例使用名为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执行简单的相等 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 }

执行计数

以下 example 使用$match pipeline operator 选择要处理的文档,然后将结果通过管道传递给$group pipeline operator 以计算文档计数:

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 }

也可以看看
使用 Zip Code 数据集进行聚合,使用用户首选项数据进行聚合