MongoDB $filter 运算符介绍
$filter
运算符是 MongoDB 中的一个数组运算符,它可以根据指定条件筛选数组中的元素,并返回一个包含所有符合条件元素的新数组。
语法
$filter
运算符的语法如下:
{ $filter: { input: <array>, as: <string>, cond: <expression> } }
参数说明:
input
:输入的数组;as
:为每个元素指定的变量名;cond
:筛选条件,是一个表达式,返回 true 则保留该元素,否则移除该元素。
使用场景
$filter
运算符通常用于以下场景:
- 在查询结果中,只返回数组中符合特定条件的元素;
- 在对数组进行聚合操作时,对数组中的元素进行筛选。
示例
示例 1
下面的聚合管道使用 $filter
运算符,筛选 scores
数组中大于等于 90 的元素:
db.students.aggregate([
{
$project: {
_id: 0,
name: 1,
passedScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gte: ["$$score", 90] }
}
}
}
}
])
假设 students
集合中有以下文档:
{
_id: 1,
name: "Alice",
scores: [90, 80, 95]
},
{
_id: 2,
name: "Bob",
scores: [75, 60, 85]
}
运行上述聚合管道后,得到的结果如下:
{
"name": "Alice",
"passedScores": [ 90, 95 ]
},
{
"name": "Bob",
"passedScores": [ 85 ]
}
示例 2:筛选数组元素
下面的聚合管道使用 $filter
运算符,筛选 orderItems
数组中产品名称为 “A” 的元素:
db.orders.aggregate([
{
$project: {
_id: 0,
orderNumber: 1,
productAItems: {
$filter: {
input: "$orderItems",
as: "item",
cond: { $eq: ["$$item.product", "A"] }
}
}
}
}
])
假设 orders
集合中有以下文档:
{
orderNumber: "2022030101",
orderItems: [
{ product: "A", quantity: 2 },
{ product: "B", quantity: 1 }
]
}
{
orderNumber: "2022030102",
orderItems: [
{ product: "C", quantity: 3 },
{ product: "A", quantity: 1 },
{ product: "D", quantity: 2 }
]
}
运行上述聚合管道后,得到的结果是:
{
"orderNumber": "2022030101",
"productAItems": [
{ "product": "A", "quantity": 2 }
]
}
{
"orderNumber": "2022030102",
"productAItems": [
{ "product": "A", "quantity": 1 }
]
}
在这个示例中, $filter
运算符的 input
参数指定了要筛选的数组,as
参数指定了在筛选过程中每个数组元素的别名,cond
参数指定了筛选条件。通过这个聚合管道,我们得到了一个新文档,其中的 productAItems
数组只包含产品名称为 “A” 的元素。
结论
通过使用 $filter
运算符,可以在聚合管道中筛选数组中符合条件的元素。这个运算符可以非常方便地对包含数组的文档进行筛选和处理,而不需要写复杂的逻辑判断代码。使用 $filter
运算符需要指定一个输入数组、一个作为当前元素的占位符以及一个条件表达式。该表达式必须返回一个布尔值,如果为 true 则保留该元素,否则将其过滤掉。
在实际应用中, $filter
运算符经常与其他聚合管道运算符一起使用,如 $project
、 $group
等。在数据处理过程中,可以根据具体的需求组合这些运算符,构建出复杂的聚合管道,以实现更加灵活和高效的数据分析和处理。