MongoDB中通过FieldID关联Form与FormData集合并转换数据结构
MongoDB关联Form与FormData集合并生成结构化数据
你可以通过MongoDB的聚合管道完成两个集合的关联与结构化转换,以下是实现代码:
db.Form.aggregate([ // 关联FormData集合,匹配相同_id的文档 { $lookup: { from: "FormData", localField: "_id", foreignField: "_id", as: "formData" } }, // 展开FormData的结果数组(每个Form对应一个FormData,展开后为单个文档) { $unwind: "$formData" }, // 展开Form中的Fields数组,逐个处理每个字段 { $unwind: "$Fields" }, // 展开FormData中的Data数组,逐个处理每个数据项 { $unwind: "$formData.Data" }, // 匹配FieldID相同的字段与数据项 { $match: { $expr: { $eq: ["$Fields.FieldID", "$formData.Data.FieldID"] } } }, // 按原文档_id分组,收集每个字段的标题与对应值 { $group: { _id: "$_id", dataEntries: { $push: { k: "$Fields.Title", v: "$formData.Data.Value" } } } }, // 将收集的键值对数组转换为结构化对象 { $project: { Data: { $arrayToObject: "$dataEntries" } } } ])
步骤解析:
- $lookup:根据
_id将FormData集合的关联数据查询出来,存入formData字段。 - $unwind:分别展开
formData、Fields和formData.Data数组,让每个字段和对应数据项成为独立文档,方便后续匹配。 - $match:通过
$expr比较字段的FieldID,确保只保留字段与数据项匹配的文档。 - $group:按原文档的
_id分组,将每个匹配成功的字段标题(Title)和对应值(Value)以{k:..., v:...}的格式存入数组。 - $project:使用
$arrayToObject将键值对数组转换为目标格式的结构化对象,得到最终结果。
内容的提问来源于stack exchange,提问作者Mani J
相关产品推荐
相关产品推荐

