MongoDB中如何用$objectToArray递归展开嵌套KV映射(已知层数)
MongoDB 递归展开指定层数的嵌套KV映射为键值集合
单聚合阶段实现(推荐)
针对指定N层嵌套映射的展开需求,可在单个$set阶段中,通过嵌套$map与$objectToArray结合类型判断实现,无需硬编码未知键名:
处理2层嵌套的示例代码
db.collection.aggregate([ { $set: { nestedMap: { $map: { input: { $objectToArray: "$nestedMap" }, as: "level1", in: { k: "$$level1.k", v: { $cond: { if: { $isObject: "$$level1.v" }, then: { $objectToArray: "$$level1.v" }, else: "$$level1.v" } } } } } } } ])
扩展到N层嵌套
若需处理3层及以上,只需在$cond的then分支中继续嵌套相同逻辑。例如处理3层嵌套时:
db.collection.aggregate([ { $set: { nestedMap: { $map: { input: { $objectToArray: "$nestedMap" }, as: "level1", in: { k: "$$level1.k", v: { $cond: { if: { $isObject: "$$level1.v" }, then: { $map: { input: { $objectToArray: "$$level1.v" }, as: "level2", in: { k: "$$level2.k", v: { $cond: { if: { $isObject: "$$level2.v" }, then: { $objectToArray: "$$level2.v" }, else: "$$level2.v" } } } } }, else: "$$level1.v" } } } } } } } ])
多阶段实现(备选)
若嵌套层数较多导致单阶段代码冗长,可拆分多个$set阶段逐层处理,每一层将当前对象转换为{k,v}数组:
db.collection.aggregate([ // 处理第一层 { $set: { nestedMap: { $objectToArray: "$nestedMap" } } }, // 处理第二层 { $set: { nestedMap: { $map: { input: "$nestedMap", as: "item", in: { k: "$$item.k", v: { $cond: [{ $isObject: "$$item.v" }, { $objectToArray: "$$item.v" }, "$$item.v"] } } } } } }, // 如需处理第三层,继续添加类似阶段 ])
输入输出示例
输入
{ "nestedMap": { "1001": { "0": "A", "1": "B", "2": "C", "3": "D" }, "1002": { "0": "A", "1": "B", "2": "C", "3": "D" } } }
输出
{ "nestedMap": [ { "k": "1001", "v": [ { "k": "0", "v": "A" }, { "k": "1", "v": "B" }, { "k": "2", "v": "C" }, { "k": "3", "v": "D" } ] }, { "k": "1002", "v": [ { "k": "0", "v": "A" }, { "k": "1", "v": "B" }, { "k": "2", "v": "C" }, { "k": "3", "v": "D" } ] } ] }
内容的提问来源于stack exchange,提问作者Arkensor
相关产品推荐
相关产品推荐

