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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:46:37