You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:03:56