MongoDB中如何关联headers与list下customData数组完成映射转换
正确聚合查询语句
db.collection.aggregate([ // 匹配符合条件的根文档 { $match: { group: ObjectId("6099614e503dd75c29c9715b"), systemDelete_DT: null } }, // 拆分list数组单独处理每一项 { $unwind: "$list" }, // 过滤已标记删除的list项 { $match: { "list.systemDelete_DT": null } }, // 前置过滤所有已标记删除的无效数据 { $project: { _id: 0, text: "$list.text", // 过滤未删除的有效表头 validHeaders: { $filter: { input: "$headers", cond: { $eq: ["$$this.systemDelete_DT", null] } } }, // 过滤当前list下未删除的自定义数据 validCustomData: { $filter: { input: "$list.customData", cond: { $eq: ["$$this.systemDelete_DT", null] } } } } }, // 组装最终输出对象 { $replaceRoot: { newRoot: { $mergeObjects: [ { text: "$text" }, { $arrayToObject: { $map: { input: "$validHeaders", as: "header", in: { k: "$$header.fieldName", v: { $first: { $filter: { input: "$validCustomData", cond: { $eq: ["$$this.field_id", "$$header._id"] } } }.fieldText } } } } } ] } } } ])
逻辑说明
- 过滤、拆分操作前置,减少后续计算的数据量,提升查询性能
- 先分别筛除
headers、customData、list中所有systemDelete_DT不为null的无效项 - 遍历有效表头,通过
_id和field_id的关联匹配到对应的自定义数据,生成键值对结构 - 用
$arrayToObject把键值对数组转为对象,和text字段合并后作为最终输出结果,完全符合预期格式要求。
内容的提问来源于stack exchange,提问作者tbowden
相关产品推荐
相关产品推荐

