You need to enable JavaScript to run this app. MongoDB中如何关联headers与list下customData数组完成映射转换
优惠活动
大模型
产品
解决方案
定价
更多

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
                  }
                }
              }
            }
          }
        ]
      }
    }
  }
])

逻辑说明

  1. 过滤、拆分操作前置,减少后续计算的数据量,提升查询性能
  2. 先分别筛除headers、customData、list中所有systemDelete_DT不为null的无效项
  3. 遍历有效表头,通过_id和field_id的关联匹配到对应的自定义数据,生成键值对结构
  4. 用$arrayToObject把键值对数组转为对象,和text字段合并后作为最终输出结果,完全符合预期格式要求。

内容的提问来源于stack exchange,提问作者tbowden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 23:15:07