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
相关产品推荐
相关产品推荐

