$filter(按条件过滤数组)

最后更新:2026-10-09

$filter(按条件过滤数组)

$filter 遍历数组,保留满足条件的元素并返回新数组,是聚合表达式里做数组过滤的首选操作符。典型场景包括筛选订单中已发货的商品、过滤掉无效标签、按评分阈值挑选评论。语法上需要提供 input 数组、as 变量名和 cond 条件表达式,条件里通过 $$变量名 引用当前元素。它只减少元素、不改变元素本身,若要同时变换元素需配合 $map。input 为 null 时返回 null。

分类数组
MongoDB 版本1.0+
示例语言mongosh (Shell)

📝 语法

{ $filter: { input: <数组>, as: <变量>, cond: <条件> } }

⚙️ 参数

input要过滤的数组表达式。
as元素变量名,cond 中用 $$变量名 引用;可选,默认 $$this。
cond返回布尔值的条件表达式,决定元素去留。

返回值:由满足条件的元素组成的新数组;input 为 null 时返回 null

▶ 示例

请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):

// $filter:只保留库存大于 0 的商品
db.orders.aggregate([
  { $project: {
      inStock: { $filter: { input: '$items', as: 'it', cond: { $gt: ['$$it.qty', 0] } } }
  } }
])

运行结果:

{ '_id': 1, 'inStock': [ { 'sku': 'A01', 'qty': 2 } ] }
{ '_id': 2, 'inStock': [] }

📌 注意事项

更多实战案例即将上线,敬请期待。

📚 相关教程

❓ 常见问题

Q$filter 和 $map 有什么区别?
A$filter 按条件删元素、不改变内容;$map 对每个元素做变换、不增减数量。两者常配合使用。
Qcond 里的变量怎么引用?
A用双美元符加变量名,如 { $gt: ['$$it.qty', 0] };省略 as 时可用 $$this。
Q$filter 能过滤对象数组吗?
A能,cond 里用 $$变量.字段 访问对象字段,如 '$$it.price'。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏