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

MongoDB基于provider_id、tenant_id聚合两集合的需求实现

MongoDB聚合:关联集合补充Provider与Tenant名称

针对你的需求,我们可以通过MongoDB的聚合管道实现provider_tenants与details_provider的关联,补充对应的名称字段。以下是具体的聚合操作代码:

db.provider_tenants.aggregate([
  // 关联details_provider集合,匹配provider_id与详情文档的_id
  {
    $lookup: {
      from: "details_provider",
      localField: "provider_id",
      foreignField: "_id",
      as: "provider_details"
    }
  },
  // 提取关联到的唯一provider详情文档(转换为对象而非数组)
  {
    $addFields: {
      provider_details: { $arrayElemAt: ["$provider_details", 0] }
    }
  },
  // 补充provider名称并处理租户数组,添加对应租户名称
  {
    $addFields: {
      tenants: {
        $map: {
          input: "$tenants",
          as: "pt_tenant",
          in: {
            _id: "$$pt_tenant._id",
            tenant_id: "$$pt_tenant.tenant_id",
            name: {
              $getField: {
                field: "name",
                input: {
                  $first: {
                    $filter: {
                      input: "$provider_details.tenants",
                      cond: { $eq: ["$$this._id", "$$pt_tenant.tenant_id"] }
                    }
                  }
                }
              }
            }
          }
        }
      },
      name: "$provider_details.name"
    }
  },
  // 移除临时字段,整理输出结构
  {
    $project: {
      provider_details: 0
    }
  }
])

各阶段说明:

  • $lookup:建立两个集合的关联,将details_provider中匹配provider_id的文档存入provider_details数组。
  • 提取详情对象:由于每个provider_id对应唯一的详情文档,用$arrayElemAt将数组转为单个对象,方便后续字段提取。
  • 补充名称字段:
    • 用$map遍历原租户数组,保留原有字段的同时,通过$filter+$first从详情文档的租户列表中匹配对应tenant_id的条目,提取其name字段。
    • 直接将详情文档的name赋值给顶层的name字段,补充provider名称。
  • 移除临时字段:删除中间生成的provider_details字段,得到符合要求的最终结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:35:20