$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': [] }
📌 注意事项
- cond 里引用当前元素必须用 $$ 前缀,如 $$it 或 $$this
- $filter 只删不换:要同时改写元素需再套一层 $map
- 条件为 null 或 false 的元素都会被剔除;input 为 null 整体返回 null
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$filter 和 $map 有什么区别?
A$filter 按条件删元素、不改变内容;$map 对每个元素做变换、不增减数量。两者常配合使用。
Qcond 里的变量怎么引用?
A用双美元符加变量名,如 { $gt: ['$$it.qty', 0] };省略 as 时可用 $$this。
Q$filter 能过滤对象数组吗?
A能,cond 里用 $$变量.字段 访问对象字段,如 '$$it.price'。