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 等。在数据处理过程中,可以根据具体的需求组合这些运算符,构建出复杂的聚合管道,以实现更加灵活和高效的数据分析和处理。