Definition 定义

对文档(documents)进行筛选,只将符合指定条件(condition(s))的文档传递给下一个 pipeline stage。

$matchstage 的原型形式如下:

  1. { $match: { <query> } }

$match接收一个指定查询条件的文档。查询语法(query syntax)与读操作的查询语法相同;也就是说,$match不接受 raw aggregation expresssions(原始的聚合表达式)。相反,使用 $expr query expression(查询表达式)才可以在$match中包含 aggregation expression。

Behavior 行为

Pipeline Optimization 管道优化

{ $match: { $expr: { <aggregation expression> } } }

  • 你不能在$match查询中使用 $where 作为 aggregation pipeline 的一部分。
  • 你不能在$match查询中使用 $near$nearSphere 作为 aggregation pipeline 的一部分。作为替代,你可以:
  • 要在$matchstage 使用 $text$matchstage 必须是 pipeline 的第一个 stage。Views(视图)不支持文本搜索(text search)。

    Example 例子

    这些例子使用一个名为articles的 collection,其中有以下文档:
    1. { "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
    2. { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
    3. { "_id" : ObjectId("55f5a192d4bede9ac365b257"), "author" : "ahn", "score" : 60, "views" : 1000 }
    4. { "_id" : ObjectId("55f5a192d4bede9ac365b258"), "author" : "li", "score" : 55, "views" : 5000 }
    5. { "_id" : ObjectId("55f5a1d3d4bede9ac365b259"), "author" : "annT", "score" : 60, "views" : 50 }
    6. { "_id" : ObjectId("55f5a1d3d4bede9ac365b25a"), "author" : "li", "score" : 94, "views" : 999 }
    7. { "_id" : ObjectId("55f5a1d3d4bede9ac365b25b"), "author" : "ty", "score" : 95, "views" : 1000 }

    Equality Match 相等匹配

    下面的 operation 使用$match来进行简单的 equality match:
    1. db.articles.aggregate( [
    2. { $match: { author: "dave" } }
    3. ] )
    $match选择了author字段等于dave的文档,aggregation 返回如下:
    1. { "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
    2. { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }

    Perform a Count 执行统计

    下面的例子使用$matchpipeline operator 选择要处理的文档,然后将结果输送给 $group pipeline operator 来计算文档的数量:
    1. db.articles.aggregate( [
    2. {
    3. $match: {
    4. $or: [
    5. { score: { $gt: 70, $lt: 90 } },
    6. { views: { $gte: 1000 } }
    7. ]
    8. }
    9. },
    10. {
    11. $group: {
    12. _id: null,
    13. count: { $sum: 1 }
    14. }
    15. }
    16. ] )
    在 aggregation pipeline 中,$match选择score大于70且小于90的文档,或者views大于等于1000的文档。然后这些文档被输送(piped)到 $group 中进行计数(preform a count)。aggregation 的结果如下:
    1. { "_id" : null, "count" : 5 }

    TIP 参阅:

参考

https://docs.mongodb.com/manual/reference/operator/aggregation/match