本文介绍使用 mongodb 聚合管道的 `$map` 操作符,将原始数组(如 `[1, 2, 3]`)高效转换为结构化对象数组(如 `[{"id": 1}, {"id": 2}, {"id": 3}]`),适用于数据建模、etl 或 api 响应标准化场景。
在 MongoDB 聚合操作中,若需将一个扁平数组(例如 ids: [1, 2, 3, 4, 5, 6])转换为具有统一结构的对象数组(如 data: [{"id": 1}, {"id": 2}, ..., {"id": 6}]),推荐使用 $map 阶段配合 $addFields(或 $set,MongoDB 4.2+ 推荐)实现。该方法无需 JavaScript(避免 $function 的性能与安全限制),完全声明式且可高效利用索引与管道优化。
以下是一个完整、可直接运行的聚合阶段示例:
[
{
$addFields: {
data: {
$map: {
input: "$ids",
as: "idValue",
in: { id: "$$idValue" }
}
}
}
}
]✅ 说明:
- $addFields 向每个文档添加新字段 data(也可用 $set 替代,语义更清晰);
- $map 遍历 "$ids" 数组,将每个元素绑定为变量 idValue;
- in 表达式定义输出对象结构 —— 此处仅生成 { id: ... },但可自由扩展,例如添加时间戳、状态字段等:
in: {
id: "$$idValue",
createdAt: { $toDate: "$$NOW" },
isActive: { $gt: ["$$idValue", 0] }
}⚠️ 注意事项:
- 若源字段 ids 可能为 null 或缺失,建议前置 $ifNull 或 $cond 处理,避免 $map 报错:
input: { $ifNull: ["$ids", []] } - $map 不改变原数组顺序,结果数组顺序与输入严格一致;
- 该操作属于聚合管道阶段,不会修改源集合;如需持久化,请结合 $merge 或应用端写回。
总结:通过 $map + $addFields 的组合,可在单个聚合阶段完成数组到对象数组的函数式转换,简洁、高效、易维护,是 MongoDB 数据形态重塑的标准实践。

$addFields: {
data: {
$map: {
input: "$ids",
as: "idValue",
in: { id: "$$idValue" }
}
}
}
}
]






