MST

星途 面试题库

面试题:MongoDB聚合框架中常用可调参数之$match详解

在MongoDB聚合框架中,$match操作符用于过滤文档。请详细阐述$match操作符在聚合管道中的作用,以及使用它时可调整的关键参数有哪些,并举例说明如何通过调整这些参数来实现不同条件的文档筛选。
36.4万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

$match操作符在聚合管道中的作用

$match操作符用于在聚合管道中根据指定的条件筛选文档,它仅允许满足条件的文档通过管道进入下一阶段,从而减少后续阶段处理的数据量,提高聚合操作的效率。

使用$match操作符可调整的关键参数

  1. 条件表达式:通过各种比较、逻辑和其他表达式来定义筛选条件。常见的比较操作符有:
    • $eq:等于。例如{ field: { $eq: value } },表示筛选出field字段值等于value的文档。
    • $gt:大于。如{ field: { $gt: value } },筛选field字段值大于value的文档。
    • $gte:大于等于。
    • $lt:小于。
    • $lte:小于等于。
    • $ne:不等于。
  2. 逻辑操作符:可组合多个条件。
    • $and:连接多个条件,所有条件都必须满足。例如{ $and: [ { field1: { $gt: 10 } }, { field2: { $lt: 20 } } ] }
    • $or:连接多个条件,只要其中一个条件满足即可。如{ $or: [ { field1: { $eq: "value1" } }, { field2: { $eq: "value2" } } ] }
    • $not:对单个条件取反。例如{ field: { $not: { $eq: value } } },筛选出field字段值不等于value的文档。

举例说明通过调整参数实现不同条件的文档筛选

假设有一个集合products,文档结构如下:

[
    { "name": "Product1", "price": 15, "category": "Electronics" },
    { "name": "Product2", "price": 25, "category": "Clothing" },
    { "name": "Product3", "price": 30, "category": "Electronics" },
    { "name": "Product4", "price": 40, "category": "Food" }
]
  1. 简单比较筛选:筛选价格大于20的产品
db.products.aggregate([
    {
        $match: {
            price: { $gt: 20 }
        }
    }
])

结果:

[
    { "name": "Product2", "price": 25, "category": "Clothing" },
    { "name": "Product3", "price": 30, "category": "Electronics" },
    { "name": "Product4", "price": 40, "category": "Food" }
]
  1. 使用逻辑操作符$and:筛选价格大于20且属于电子产品类别的产品
db.products.aggregate([
    {
        $match: {
            $and: [
                { price: { $gt: 20 } },
                { category: "Electronics" }
            ]
        }
    }
])

结果:

[
    { "name": "Product3", "price": 30, "category": "Electronics" }
]
  1. 使用逻辑操作符$or:筛选价格小于18或者属于食品类别的产品
db.products.aggregate([
    {
        $match: {
            $or: [
                { price: { $lt: 18 } },
                { category: "Food" }
            ]
        }
    }
])

结果:

[
    { "name": "Product1", "price": 15, "category": "Electronics" },
    { "name": "Product4", "price": 40, "category": "Food" }
]
  1. 使用$not操作符:筛选价格不等于25的产品
db.products.aggregate([
    {
        $match: {
            price: { $not: { $eq: 25 } }
        }
    }
])

结果:

[
    { "name": "Product1", "price": 15, "category": "Electronics" },
    { "name": "Product3", "price": 30, "category": "Electronics" },
    { "name": "Product4", "price": 40, "category": "Food" }
]