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

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"
  }}
])

正确查询的逻辑说明

  1. 拆分书籍数组:仅拆分subject.book,不碰作者数组,确保每个文档对应完整的单本书籍;关闭空数组保留,自动过滤无书籍的科目(比如IACT201和CSCI321)。
  2. 计算作者数量:用$size直接获取author数组的长度,避免拆分后的数据混乱。
  3. 精准筛选:通过$gte和$lte锁定作者数量在2到3之间的书籍。
  4. 精简输出:投影只保留需求的三个字段,去掉冗余信息。

运行这个查询后,会准确返回样本数据中符合要求的书籍:

  • CSCI103里作者数为3的参考书籍
  • CSCI235里两本作者数为2的专业书籍

内容的提问来源于stack exchange,提问作者MINGLONG li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:32:50