MongoDB如何实现自连接查询 获取符合匹配条件的姓名配对结果
MongoDB姓名配对查询实现
前置信息
现有名为Dater的MongoDB集合,已写入3条测试文档:
db.Dater.insert({"Name" : "Ann", "Gender" : "F", "GenderSearch" : "M" }) db.Dater.insert({"Name" : "Bob", "Gender" : "M", "GenderSearch" : "F"}) db.Dater.insert({"Name" : "Cat", "Gender" : "F", "GenderSearch" : "F"})
需求说明
编写查询语句返回所有姓名配对结果,结构要求:
- 以用户姓名字段为键
- 键对应的值为符合匹配规则的姓名列表
- 匹配规则:列表内用户的
Gender字段值等于当前键对应用户的GenderSearch字段值
参考SQL自连接实现(仅返回二维表结构,未聚合为键值列表格式):
SELECT d1.Name, d2.Name FROM Dater d1 JOIN Dater d2 ON d1.GenderSearch = d2.Gender
实现代码
通过MongoDB聚合管道实现自连接+结构转换,完整查询语句如下:
db.Dater.aggregate([ // 自连接匹配符合规则的用户 { $lookup: { from: "Dater", localField: "GenderSearch", foreignField: "Gender", as: "matchedUsers" } }, // 提取匹配用户的姓名,生成纯姓名列表 { $project: { _id: 0, Name: 1, matchedNames: { $map: { input: "$matchedUsers", in: "$$this.Name" } } } }, // 转换为「姓名:匹配列表」的键值结构 { $group: { _id: null, res: { $push: { k: "$Name", v: "$matchedNames" } } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$res" } } } ])
逻辑说明
$lookup阶段实现和参考SQL等价的自连接逻辑,关联条件为当前用户的GenderSearch等于被关联用户的Gender,关联结果存入数组字段$project阶段剔除_id等冗余字段,通过$map遍历关联用户数组,提取姓名字段生成纯姓名匹配列表- 最后两个聚合阶段将逐行存储的用户匹配结果,转换为要求的单对象键值对结构
测试数据返回结果
{ "Ann": ["Bob"], "Bob": ["Ann", "Cat"], "Cat": ["Ann", "Cat"] }
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

