MongoDB 从变长嵌套数组动态生成键值对的实现方法
MongoDB聚合动态生成嵌套对象字段实现方案
核心实现逻辑
- 单独使用
$map只能返回数组结构,无法直接生成键值对对象,需要搭配$arrayToObject操作符做格式转换 - 动态键名不需要硬编码,通过字符串分割从
category.coding.code字段自动提取:将code值按/分割后取最后一段,即可得到paid_amt、discount_amt这类目标键名 - 逐层遍历外层
item数组、内层adjudication数组做转换即可,不限制adjudication的元素数量
可直接复用的聚合管道代码
db.your_collection.aggregate([ { $addFields: { item: { $map: { input: "$item", as: "singleItem", in: { $mergeObjects: [ "$$singleItem", { adjudication: { $arrayToObject: { $map: { input: "$$singleItem.adjudication", as: "singleAdj", in: { // 提取斜杠后的字符串作为动态键 k: { $last: { $split: [ { $first: "$$singleAdj.category.coding.code" }, "/" ] } }, // 取金额值作为键对应的值 v: "$$singleAdj.amount.value" } } } } } ] } } } } } ])
输出效果
转换后adjudication字段结构完全匹配预期:
{ "adjudication": { "paid_amt": 22.51, "discount_amt": 0 } }
适配调整说明
- 如果
coding数组存在多个元素,可以先用$filter筛选出system等于bb.org/adjudication的元素再取code值,避免取错键 - 该逻辑自动适配所有同格式的code取值,不需要提前枚举所有可能的键名
- 如果不需要保留item下的其他原有字段,可以去掉
$mergeObjects部分,直接返回转换后的adjudication字段即可
内容的提问来源于stack exchange,提问作者Vikram Jindal
相关产品推荐
相关产品推荐

