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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:57:52