$map(对数组每个元素做变换)
最后更新:2026-10-09
$map(对数组每个元素做变换)
$map 遍历数组,把每个元素交给 in 表达式处理并收集结果,返回与输入等长的新数组。它是聚合表达式里最常用的函数式操作符,典型场景包括给订单商品统一加税、把字符串数组转大写、从对象数组提取字段。as 变量在 in 里用 $$变量名 引用,省略时可用 $$this。$map 不改变数组长度,只改变元素内容;与 $filter(删元素)、$reduce(归约)互补。
| 分类 | 数组 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $map: { input: <数组>, as: <变量>, in: <表达式> } }
⚙️ 参数
| input | 要遍历的数组。 |
|---|---|
| as | 元素变量名,in 中用 $$变量名 引用;可选,默认 $$this。 |
| in | 对每个元素求值的表达式,其结果组成新数组。 |
返回值:每个元素经 in 处理后的新数组;input 为 null 时返回 null
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $map:把商品数量翻倍
db.orders.aggregate([
{ $project: {
doubled: { $map: { input: '$items', as: 'it', in: { $multiply: ['$$it.qty', 2] } } }
} }
])
运行结果:
{ '_id': 1, 'doubled': [ 4, 6 ] }
{ '_id': 2, 'doubled': [ 2 ] }
📌 注意事项
- in 是对每个元素求值的最终表达式;as 变量要用 $$ 前缀引用
- $map 保持数组长度:只改元素不改数量,删元素用 $filter
- in 里可以嵌套 $map/$filter/$reduce,构成函数式管道
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$map 和 $filter 有什么区别?
A$map 对每个元素做变换、长度不变;$filter 按条件删元素、内容不变。两者可嵌套组合。
Q$map 能改变数组长度吗?
A不能,结果与输入等长。要变长度用 $filter 或 $reduce。
Qas 变量可以省略吗?
A可以,省略后在 in 里用 $$this 引用当前元素。