如何从MongoDB集合中获取非数组类型动态子文档并格式化输出
解决方案
要实现你需要的格式输出,我们可以利用MongoDB的聚合管道来处理嵌套的rltns对象,把它拆解为可遍历的条目,再提取并拼接目标字段。以下是具体的实现步骤和代码:
聚合查询代码
db.employee.aggregate([ // 第一步:匹配目标id的文档 { $match: { id: "12345" } }, // 第二步:将rltns对象转为键值对数组,处理rltns不存在的情况(默认空数组) { $addFields: { rltnsEntries: { $ifNull: [ { $objectToArray: "$rltns" }, [] ] } } }, // 第三步:展开数组,每个关联关系单独成为一条文档 { $unwind: { path: "$rltnsEntries", preserveNullAndEmptyArrays: true } }, // 第四步:拼接成你需要的字符串格式,处理无关联关系的情况 { $project: { _id: 0, result: { $cond: { if: { $eq: [ "$rltnsEntries", [] ] }, then: { $concat: [ "$id", " | 无关联关系" ] }, else: { $concat: [ "$id", " | ", "$rltnsEntries.k", " | ", "$rltnsEntries.v.field1", " | ", "$rltnsEntries.v.field2" ] } } } } } ])
代码细节解释
- $match:精准定位到
id为"12345"的文档,减少后续处理的数据量。 - $objectToArray:把
rltns这个嵌套对象转成[{k: "MO", v: {field1: ...}}, ...]的数组格式,方便后续遍历;搭配$ifNull处理rltns不存在或为空的场景,避免丢失文档。 - $unwind:将数组中的每个元素拆分为单独的文档,
preserveNullAndEmptyArrays: true确保当没有关联关系时,依然保留原文档进行处理。 - $concat:按照你要求的「id | 关联类型 | field1 | field2」格式拼接字符串;用
$cond处理无关联关系的特殊情况,输出友好提示。
输出示例
- 当有多个关联关系时,会返回多条结果:
{ "result" : "12345 | MO | hi | hello" } { "result" : "12345 | FA | check01 | check02" } - 当没有关联关系时,返回:
{ "result" : "12345 | 无关联关系" }
如果你希望把所有结果合并成一条字符串(每条占一行),可以在上述聚合的最后添加以下阶段:
{ $group: { _id: null, allResults: { $push: "$result" } } }, { $project: { _id: 0, finalResult: { $join: { input: "$allResults", separator: "\n" } } } }
内容的提问来源于stack exchange,提问作者babaipalta
相关产品推荐
相关产品推荐

