MongoDB:通过Lookup统计多文档数组中的笔记总数
统计指定ISBN书籍的所有章节笔记总数(MongoDB聚合方案)
场景1:直接从notes集合统计(高效,已知ISBN有效)
如果已经确认目标ISBN存在,直接对notes集合做聚合就能得到结果,步骤清晰:
- 过滤出目标ISBN的所有章节文档
- 计算每个章节的笔记数量(用
$size取notes数组长度) - 累加所有章节的数量得到总数
对应的聚合代码:
db.notes.aggregate([ // 筛选目标ISBN的章节文档 { $match: { isbn: "9789401466097" } }, // 计算单章节笔记数 { $addFields: { chapterNoteCount: { $size: "$notes" } } }, // 累加所有章节的笔记数 { $group: { _id: "$isbn", totalNotes: { $sum: "$chapterNoteCount" } } } ])
场景2:关联books集合统计(确保ISBN对应有效书籍)
如果需要先验证ISBN存在于books集合中,再统计笔记,可以用$lookup关联后计算:
db.books.aggregate([ // 先匹配目标书籍 { $match: { isbn: "9789401466097" } }, // 关联对应ISBN的所有章节笔记文档 { $lookup: { from: "notes", localField: "isbn", foreignField: "isbn", as: "bookNotes" } }, // 遍历每个章节文档,计算单章节笔记数后累加 { $addFields: { totalNotes: { $sum: { $map: { input: "$bookNotes", as: "chapter", in: { $size: "$$chapter.notes" } } } } } }, // 只返回需要的字段 { $project: { isbn: 1, totalNotes: 1, _id: 0 } } ])
你之前可能踩的坑
- 用
$lookup后直接对bookNotes用$size,得到的是章节数量而非笔记总数 - 没在
$group里用$sum累加每个章节的$size结果,而是错误统计了文档数量
内容的提问来源于stack exchange,提问作者Jeex
相关产品推荐
相关产品推荐

