MongoDB聚合查询问题排查:查找作者数量为2至3的书籍ISBN、书名及出版社
排查MongoDB聚合查询错误并解决需求
让我来帮你分析原查询的问题,然后给出精准的解决方案:
原查询的核心错误点
- 拼写失误:
$suject.book.ISBN里的suject少了字母b,应该是$subject.book.ISBN,这个小错误会导致ISBN字段无法正确提取。 - 错误的Unwind操作:你连续拆分了
book数组和book.author数组,这会把每本书的每个作者拆成独立文档。后续按作者分组统计的是单个作者的出现次数,而非每本书的作者总数,完全偏离了需求方向。 - Group逻辑偏差:原group的
_id包含了单个作者,导致每个作者成为独立分组,counts值只会是1(除非同一本书同一作者重复),所以后续匹配counts:2或3的条件根本无法命中正确书籍。
正确的聚合查询语句
要获取作者数量在2-3之间的书籍,我们不需要拆分作者数组,直接用$size操作符计算每本书的作者总数即可,完整代码如下:
db.Subject.aggregate([ // 拆分subject.book数组,每一个文档对应一本书,过滤无书籍的科目 {$unwind: {path: "$subject.book", preserveNullAndEmptyArrays: false}}, // 新增字段存储每本书的作者数量 {$addFields: { "authorCount": {$size: "$subject.book.author"} }}, // 筛选作者数量符合2-3要求的书籍 {$match: { "authorCount": {$gte: 2, $lte: 3} }}, // 只保留需要的ISBN、书名、出版社字段 {$project: { _id: 0, ISBN: "$subject.book.ISBN", bookTitle: "$subject.book.bookTitle", publisher: "$subject.book.publisher" }} ])
正确查询的逻辑说明
- 拆分书籍数组:仅拆分
subject.book,不碰作者数组,确保每个文档对应完整的单本书籍;关闭空数组保留,自动过滤无书籍的科目(比如IACT201和CSCI321)。 - 计算作者数量:用
$size直接获取author数组的长度,避免拆分后的数据混乱。 - 精准筛选:通过
$gte和$lte锁定作者数量在2到3之间的书籍。 - 精简输出:投影只保留需求的三个字段,去掉冗余信息。
运行这个查询后,会准确返回样本数据中符合要求的书籍:
- CSCI103里作者数为3的参考书籍
- CSCI235里两本作者数为2的专业书籍
内容的提问来源于stack exchange,提问作者MINGLONG li
相关产品推荐
相关产品推荐

