如何将MongoDB查询结果中的元素名称映射为表单字段标题?
解决方案
你可以通过MongoDB的聚合管道实现字段ID到标题的映射,具体聚合查询如下:
db.FormData.aggregate([ // 关联Form集合,匹配相同_id的文档 { $lookup: { from: "Form", localField: "_id", foreignField: "_id", as: "formInfo" } }, // 展开关联得到的formInfo数组 { $unwind: "$formInfo" }, // 将FormData中除_id外的动态字段转为k-v数组 { $project: { _id: 1, data: { $objectToArray: "$$ROOT" }, fields: "$formInfo.Fields" } }, // 过滤掉data数组中的_id元素 { $project: { _id: 1, data: { $filter: { input: "$data", cond: { $ne: ["$$this.k", "_id"] } } }, fields: 1 } }, // 展开data数组 { $unwind: "$data" }, // 展开fields数组 { $unwind: "$fields" }, // 匹配字段ID一致的条目 { $match: { $expr: { $eq: ["$data.k", "$fields.FieldID"] } } }, // 按_id分组,收集标题与对应值的映射 { $group: { _id: "$_id", mappedFields: { $push: { k: "$fields.Title", v: "$data.v" } } } }, // 将映射数组转为对象,并合并_id { $replaceRoot: { newRoot: { $mergeObjects: [ { _id: "$_id" }, { $arrayToObject: "$mappedFields" } ] } } } ])
步骤说明
- $lookup:关联Form集合,获取当前文档对应的字段标题配置。
- $objectToArray:把FormData中的动态字段(即那些UUID键)转换成键值对数组,方便后续匹配。
- $filter:移除转换后数组中的
_id元素,避免干扰后续匹配。 - 两次$unwind:分别展开数据数组和字段配置数组,让每个字段ID和对应的标题能一一匹配。
- $match:筛选出字段ID一致的条目,建立ID到标题的映射关系。
- $group:按文档ID分组,把标题和对应值收集成新的键值对数组。
- $arrayToObject + $replaceRoot:把收集的数组转换成对象,替换为根文档,得到最终的映射结果。
内容的提问来源于stack exchange,提问作者Mani J
相关产品推荐
相关产品推荐

