如何在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 })
代码说明
$objectToArray:将嵌套的user对象转换为[{k: "字段名", v: "值"}]格式的数组。$map:遍历数组元素,将键名拼接为user_原始字段名的格式,保留对应的值。$arrayToObject:把处理后的键值对数组转回对象,得到{user_id: "...", user_name: "..."}结构。$mergeObjects:将扁平化后的对象与根文档合并,把字段提升到根层级。$unset:清理原始user对象和临时flattenedUser字段。
该方案会自动处理user对象下的所有字段,无论字段是否存在、后续新增何种字段,都能自动完成扁平化,无需修改代码。
内容的提问来源于stack exchange,提问作者mstolet
相关产品推荐
相关产品推荐

