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
相关产品推荐
相关产品推荐

