MongoDB多集合引用关联查询:关联technicians、services、tags
解决MongoDB三集合关联查询问题
正确的聚合查询语句
db.technicians.aggregate([ // 第一步:关联services集合,获取技师对应的服务 { $lookup: { from: "services", localField: "services", foreignField: "_id", as: "myservices" } }, // 展开服务数组(每个技师关联单个服务,展开后方便后续关联标签) { $unwind: "$myservices" }, // 第二步:关联tags集合,通过服务的tagid获取对应标签 { $lookup: { from: "tags", localField: "myservices.tagid", foreignField: "_id", as: "mytags" } }, // 展开标签数组(每个服务关联单个标签) { $unwind: "$mytags" }, // 投影仅保留需要的字段,对应SQL的select逻辑 { $project: { _id: 0, "technician_name": "$name", "service_name": "$myservices.name", "tag_name": "$mytags.name" } } ])
关键修正说明
- 拆分聚合阶段:每个
$lookup必须作为独立的聚合阶段,不能合并在同一个对象中。 - 修正关联字段:第二个
$lookup的localField需指向第一个关联得到的myservices.tagid,而非直接写tagid;foreignField是tags集合的_id,不是tags._id。 - 展开数组结果:
$lookup返回的是数组类型数据,用$unwind展开为单个文档,确保后续关联和字段提取的准确性。 - 精准筛选字段:通过
$project过滤出需要的字段,还可以重命名为更直观的名称,完全对应SQL的查询结果结构。
示例返回结果
当数据关联关系匹配时,会输出类似如下结构的文档:
{ "technician_name": "John", "service_name": "plumber", "tag_name": "motor" }
内容的提问来源于stack exchange,提问作者TeeTask TeeTask
相关产品推荐
相关产品推荐

