MongoDB单查询实现:通过用户邮箱关联查询所属文档
用单个MongoDB查询获取指定邮箱用户的文档
当然可以用单个查询搞定!MongoDB的聚合框架里的$lookup操作符就是干这个的——相当于关系型数据库里的左连接,能帮你一次性关联Users和Documents两个集合的数据,不用分两次查询。
这里给你两种实用的实现方式:
方式一:从Users集合出发(推荐,效率更高)
先精准匹配到目标邮箱的用户,再关联他所有的文档,这样能减少后续关联的数据量:
db.Users.aggregate([ // 第一步:锁定邮箱为aaa@gmail.com的用户 { $match: { email: "aaa@gmail.com" } }, // 第二步:关联Documents集合,匹配owner等于当前用户的_id { $lookup: { from: "Documents", // 要关联的集合名称 localField: "_id", // Users集合里用来匹配的字段 foreignField: "owner", // Documents集合里对应的匹配字段 as: "user_documents" // 关联结果存储的数组字段名 } }, // 可选:只返回文档数组,去掉用户的其他信息 { $project: { _id: 0, user_documents: 1 } } ])
执行后,你会得到一个包含user_documents数组的结果,里面就是该用户所有的Documents文档。
方式二:从Documents集合出发
如果需要同时保留文档和对应的用户信息,或者想从文档侧发起查询,可以这么写:
db.Documents.aggregate([ // 第一步:把每个文档关联到对应的用户信息 { $lookup: { from: "Users", localField: "owner", foreignField: "_id", as: "user_info" } }, // 第二步:过滤出用户邮箱为aaa@gmail.com的文档 { $match: { "user_info.email": "aaa@gmail.com" } }, // 可选:去掉user_info字段,只保留文档本身 { $project: { user_info: 0 } } ])
这个查询会先给每个文档关联对应的用户数据,再筛选出属于目标邮箱用户的文档。
注意:如果你的Documents集合数据量很大,方式一的效率会更高,因为它先缩小了用户范围,再做关联操作。
内容的提问来源于stack exchange,提问作者Jacek Wojcik
相关产品推荐
相关产品推荐

