MongoDB $lookup实现一对多关联 按collegeId查询书籍及关联库存
MongoDB关联查询问题修正方案
原代码错误点
- 第一阶段
$match的过滤条件错误:books集合本身没有bookStocks字段,该字段是$lookup关联后才生成的,放在第一阶段过滤会直接匹配不到任何数据 $lookup的let变量取值错误:books集合中关联bookStocks的字段是主键_id,不是不存在的bookId- 关联子查询没有加collegeId过滤:会查出某本书所有学院的库存,不符合仅查询指定学院库存的需求
- 缺少空数组过滤:没有对应学院库存的书籍不需要返回,需要最后过滤掉
bookStocks为空的文档
正确聚合写法
注意该聚合是在books集合上执行,入参collegeId替换为你实际的参数值即可:
const pipeline = [ // 关联bookStocks集合,匹配对应书籍+指定学院的库存 { $lookup: { from: "bookStocks", let: { book_id: "$_id" }, // 取books集合的_id作为关联变量 pipeline: [ { $match: { $expr: { $eq: ["$$book_id", "$bookId"] // 库存的bookId和书籍_id匹配 }, collegeId: collegeId // 直接过滤指定学院的库存 } } ], as: "bookStocks" } }, // 过滤掉没有对应学院库存的书籍 { $match: { bookStocks: { $ne: [] } } } ]; // 执行方式示例 db.books.aggregate(pipeline)
内容的提问来源于stack exchange,提问作者Haris George
相关产品推荐
相关产品推荐

