MongoDB批量转换集合文档:将含数组的嵌套对象展平为单个数组
MongoDB文档结构转换方案
要将集合中所有文档的fruits字段从嵌套对象转换为带前缀的单数组,可以使用MongoDB的聚合管道式更新,具体命令如下:
db.yourCollection.updateMany( {}, // 匹配所有文档 [ // 1. 将fruits对象转为键值对数组([{k: "brasil", v: ["pineapple", "mango"]}, ...]) { $set: { fruits: { $objectToArray: "$fruits" } } }, // 2. 展开每个国家的键值对条目 { $unwind: "$fruits" }, // 3. 展开每个国家对应的水果数组 { $unwind: "$fruits.v" }, // 4. 拼接国家前缀和水果名 { $set: { fruits: { $concat: ["$fruits.k", "_", "$fruits.v"] } } }, // 5. 按文档ID分组,将拼接后的结果收集为数组 { $group: { _id: "$_id", fruits: { $push: "$fruits" } } }, // 可选:保留原文档的其他字段(如果有),例:otherField: { $first: "$otherField" } ] )
关键步骤说明:
$objectToArray:把fruits的嵌套对象转换成{k: 国家名, v: 水果数组}的键值对数组- 两次
$unwind:先展开国家条目,再展开每个国家下的水果列表,得到单个国家-水果的组合 $concat:将国家名和水果名用下划线拼接,生成唯一标识$group:按原文档_id重新聚合,把所有拼接后的字符串收集到fruits数组中
注意事项:
- 替换命令中的
yourCollection为你的实际集合名称 - 如果文档包含其他需要保留的字段,需要在
$group阶段用$first或$last指定保留,例如:{ $group: { _id: "$_id", fruits: { $push: "$fruits" }, otherField: { $first: "$otherField" } } } - 建议先对单个文档测试(将
updateMany改为updateOne),确认结果符合预期后再批量更新
内容的提问来源于stack exchange,提问作者Lucien Chardon
相关产品推荐
相关产品推荐

