MongoDB中如何查询指定userId的书籍列表并附带页数统计?
最优解法:用MongoDB聚合框架一次搞定
嘿,你这个场景完全不用挨个查页面集合,MongoDB的聚合框架就能帮你一次完成查询和计数,效率比N+1查询高多了!
核心思路是通过$lookup关联书籍和页面集合,再用$size统计每个书籍对应的页面总数,具体的聚合管道如下:
db.books.aggregate([ // 先筛选出目标用户的所有书籍,减少后续处理的数据量 { $match: { userId: "你的目标用户ID" } }, // 关联页面集合,将每本书对应的所有页面以数组形式返回 { $lookup: { from: "pages", // 要关联的集合名 localField: "_id", // 书籍集合中用于关联的字段(书籍ID) foreignField: "bookId", // 页面集合中对应的关联字段(所属书籍ID) as: "pages" // 关联结果存储的数组字段名 } }, // 计算页面总数,添加pageCount字段 { $addFields: { pageCount: { $size: "$pages" } // 用$size获取pages数组的长度,就是页面总数 } }, // 可选:精简返回字段,移除不需要的pages数组 { $project: { _id: 1, name: 1, description: 1, pageCount: 1 } } ])
关键优化点:
- 索引优化:一定要给
pages集合的bookId字段创建索引,这样$lookup关联时能快速定位到对应书籍的页面,大幅提升查询速度:db.pages.createIndex({ bookId: 1 }) - 提前过滤:
$match阶段放在最前面,先筛选出目标用户的书籍,避免处理无关数据,减少聚合管道的计算量。
这个方案和你之前的“查书籍再挨个查页数”相比,只需要一次数据库请求,避免了N+1查询的性能问题,尤其是当用户有大量书籍时,优势非常明显。
内容的提问来源于stack exchange,提问作者Lorenzo Polidori
相关产品推荐
相关产品推荐

