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

如何在MongoDB中自动扁平化嵌套对象?

MongoDB自动扁平化嵌套对象(无需手动指定字段)

需求场景

需要将嵌套的user对象扁平化,从:

"user": {
      "id": "AEC77ACD-02D3-0057-842F-DC23D6312389",
      "name": "Eliza Chukiua",
      "email": "eliza.chukiua@booking.com",
      "group": "SSO",
      "externalId": "eliza.chukiua@booking.com"
}

转换为:

"user_email": "eliza.chukiua@booking.com",
"user_externalId": "eliza.chukiua@booking.com",
"user_group": "SSO",
"user_id": "AEC77ACD-02D3-0057-842F-DC23D6312389",
"user_name": "Eliza Chukiua"

原有手动实现需要逐个指定$set字段,无法适配字段不固定、新增未知字段的场景。

自动扁平化解决方案

利用MongoDB的$objectToArray、$map和$arrayToObject操作符动态处理所有嵌套字段,无需手动指定:

db.collection.update({}, [
  {
    $set: {
      flattenedUser: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$user" },
            as: "item",
            in: {
              k: { $concat: ["user_", "$$item.k"] },
              v: "$$item.v"
            }
          }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: ["$$ROOT", "$flattenedUser"] }
    }
  },
  {
    $unset: ["user", "flattenedUser"]
  }
], { multi: true })

代码说明

  1. $objectToArray:将嵌套的user对象转换为[{k: "字段名", v: "值"}]格式的数组。
  2. $map:遍历数组元素,将键名拼接为user_原始字段名的格式,保留对应的值。
  3. $arrayToObject:把处理后的键值对数组转回对象,得到{user_id: "...", user_name: "..."}结构。
  4. $mergeObjects:将扁平化后的对象与根文档合并,把字段提升到根层级。
  5. $unset:清理原始user对象和临时flattenedUser字段。

该方案会自动处理user对象下的所有字段,无论字段是否存在、后续新增何种字段,都能自动完成扁平化,无需修改代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:01:03