You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数组中

注意事项:

  1. 替换命令中的yourCollection为你的实际集合名称
  2. 如果文档包含其他需要保留的字段,需要在$group阶段用$first或$last指定保留,例如:
    { $group: { _id: "$_id", fruits: { $push: "$fruits" }, otherField: { $first: "$otherField" } } }
    
  3. 建议先对单个文档测试(将updateMany改为updateOne),确认结果符合预期后再批量更新

内容的提问来源于stack exchange,提问作者Lucien Chardon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:02:43