
本文介绍使用 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" }
}
}
}
}
]✅ 说明:
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- $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 数据形态重塑的标准实践。









