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

MongoDB查询:筛选editions.editionId存在重复的书籍文档

找出包含重复editionId的书籍文档

嘿,作为MongoDB新手碰到这种数组内重复值的筛选需求确实有点棘手,毕竟普通的find()查询没法直接处理数组内部的重复判断,咱们得用聚合管道来实现这个需求,我给你详细拆解一下步骤:

实现思路

要找出editions.editionId有重复的书籍,核心是先统计每本书里每个editionId出现的次数,再筛选出次数大于1的书籍。具体步骤如下:

  • 先把editions数组拆分成单个文档(用$unwind),方便后续统计
  • 按书籍ID和editionId分组,统计每个组合的出现次数
  • 筛选出次数大于1的分组(说明该书籍有重复的editionId)
  • 最后根据这些书籍ID,从原集合中取出完整的书籍文档

完整聚合查询代码

db.books.aggregate([
  // 1. 展开editions数组,每个元素成为独立文档
  { $unwind: "$editions" },
  // 2. 按bookId和editionId分组,统计每个editionId的出现次数
  {
    $group: {
      _id: { bookId: "$bookId", editionId: "$editions.editionId" },
      count: { $sum: 1 }
    }
  },
  // 3. 筛选出出现次数>1的分组(即有重复的editionId)
  { $match: { count: { $gt: 1 } } },
  // 4. 再按bookId分组,得到所有有重复editionId的bookId列表
  {
    $group: {
      _id: "$_id.bookId"
    }
  },
  // 5. 关联原books集合,获取完整的书籍文档
  {
    $lookup: {
      from: "books",
      localField: "_id",
      foreignField: "bookId",
      as: "bookDetails"
    }
  },
  // 6. 把bookDetails数组展开成单个文档,方便查看结果
  { $unwind: "$bookDetails" },
  // 7. 只保留需要的书籍字段(可选,根据需求调整)
  {
    $project: {
      _id: 0,
      bookId: "$bookDetails.bookId",
      title: "$bookDetails.title",
      publicationDate: "$bookDetails.publicationDate",
      editions: "$bookDetails.editions"
    }
  }
])

针对你的示例数据

运行这个查询后,只会返回bookId: 2的文档,因为它的editions数组里有两个editionId: 1,符合重复的条件;而bookId: 1的两个editionId都是唯一的,不会被返回。

简化版可选方案

如果只需要得到有重复editionId的书籍ID,不需要完整文档,可以把最后三步($lookup、$unwind、$project)去掉,这样结果会更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:43:04