MongoDB跨集合查询:将成员关联教堂ObjectId转为名称并排序
MongoDB 关联查询替换ID为名称及排序实现方案
查询语句
基于MongoDB 4.4.10版本特性,可直接使用如下聚合查询实现需求:
db.Members.aggregate([ // 关联Churches集合,匹配成员church ID与教堂ID { $lookup: { from: "Churches", localField: "church", foreignField: "_id", as: "matchedChurch" } }, // 拆解关联返回的数组(1对1关联场景下数组仅包含1条匹配数据) { $unwind: "$matchedChurch" }, // 替换church字段为教堂名称,同时生成统一成员名字段用于后续排序 { $set: { church: "$matchedChurch.name", sortMemberName: { $ifNull: ["$name", "$nome"] } } }, // 按规则排序:先按教堂名称升序,再按成员名称升序 { $sort: { church: 1, sortMemberName: 1 } }, // 清理多余临时字段 { $unset: ["matchedChurch", "sortMemberName"] } ])
逻辑说明
$lookup默认返回数组格式结果,使用$unwind拆解后才能直接取到匹配到的单个教堂对象- 原
Members集合存在name和nome两种成员名称字段,这里通过$ifNull做兼容处理生成统一排序字段,如果你后续统一了成员名称字段,可直接删除该逻辑,排序阶段直接写对应字段即可 - 如果需要过滤掉没有匹配到有效教堂的成员记录,可以在
$unwind阶段添加参数preserveNullAndEmptyArrays: false,会自动剔除无匹配的成员数据
内容的提问来源于stack exchange,提问作者DValdir Martins
相关产品推荐
相关产品推荐

