面试题答案
一键面试$match操作符在聚合管道中的作用
$match
操作符用于在聚合管道中根据指定的条件筛选文档,它仅允许满足条件的文档通过管道进入下一阶段,从而减少后续阶段处理的数据量,提高聚合操作的效率。
使用$match操作符可调整的关键参数
- 条件表达式:通过各种比较、逻辑和其他表达式来定义筛选条件。常见的比较操作符有:
$eq
:等于。例如{ field: { $eq: value } }
,表示筛选出field
字段值等于value
的文档。$gt
:大于。如{ field: { $gt: value } }
,筛选field
字段值大于value
的文档。$gte
:大于等于。$lt
:小于。$lte
:小于等于。$ne
:不等于。
- 逻辑操作符:可组合多个条件。
$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" }
]
- 简单比较筛选:筛选价格大于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" }
]
- 使用逻辑操作符
$and
:筛选价格大于20且属于电子产品类别的产品
db.products.aggregate([
{
$match: {
$and: [
{ price: { $gt: 20 } },
{ category: "Electronics" }
]
}
}
])
结果:
[
{ "name": "Product3", "price": 30, "category": "Electronics" }
]
- 使用逻辑操作符
$or
:筛选价格小于18或者属于食品类别的产品
db.products.aggregate([
{
$match: {
$or: [
{ price: { $lt: 18 } },
{ category: "Food" }
]
}
}
])
结果:
[
{ "name": "Product1", "price": 15, "category": "Electronics" },
{ "name": "Product4", "price": 40, "category": "Food" }
]
- 使用
$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" }
]