如何使用Java的MongoCollection查找含重复数组元素的文档?
Hey,我来帮你搞定这个MongoDB查询的问题。首先得指出你之前写的代码有语法问题,咱们先理清两种常见的需求场景,再给你正确的实现方式:
场景1:查找特定医生的文档中,是否包含某个病人ID
如果你的目标是确认某个病人ID(也就是代码里的idJugador)是否存在于指定idProf对应的文档的pacientes数组中,那正确的查询写法应该是直接匹配数组元素,MongoDB原生支持这种数组匹配:
// 替换成你的实际ID值 String targetIdProf = "5b1ff7c53e3ac841302cfbbf"; String targetPacienteId = "5b20d2c83e3ac841302cfbdb"; // 构建查询:匹配idProf,同时pacientes数组包含目标病人ID BasicDBObject query = new BasicDBObject("idProf", targetIdProf) .append("pacientes", targetPacienteId); // 执行查询并遍历结果 FindIterable<Document> matchingDocs = collection.find(query); for (Document doc : matchingDocs) { System.out.println("找到匹配的医生文档:" + doc.toJson()); }
如果以后需要对数组元素做更复杂的多条件匹配,再用$elemMatch,这个场景下直接匹配就足够简洁高效。
场景2:查找所有存在重复病人ID的医生文档
要是你想找出集合里那些pacientes数组内部有重复条目的文档,就得借助MongoDB的聚合框架或者$expr表达式来对比数组原始长度和去重后的长度:
方法1:用聚合查询(推荐,功能扩展性强)
AggregateIterable<Document> duplicateDocs = collection.aggregate(Arrays.asList( // 新增临时字段,存储去重后的病人数组长度 new BasicDBObject("$addFields", new BasicDBObject( "uniqueCount", new BasicDBObject("$size", new BasicDBObject("$setUnion", Arrays.asList("$pacientes"))) )), // 筛选出原始长度和去重长度不等的文档(说明有重复) new BasicDBObject("$match", new BasicDBObject( "$expr", new BasicDBObject("$ne", Arrays.asList("$size", "$pacientes", "$uniqueCount")) )), // 可选:移除临时字段,让返回结果更干净 new BasicDBObject("$project", new BasicDBObject("uniqueCount", 0)) )); // 遍历结果 for (Document doc : duplicateDocs) { System.out.println("存在重复病人的文档:" + doc.toJson()); }
方法2:用find配合$expr(更简洁,适用于MongoDB 3.6及以上版本)
// 直接通过表达式判断:数组原始长度 != 去重后的长度 BasicDBObject query = new BasicDBObject("$expr", new BasicDBObject( "$ne", Arrays.asList( "$size", "$pacientes", "$size", new BasicDBObject("$setUnion", Arrays.asList("$pacientes")) ) )); FindIterable<Document> duplicateDocs = collection.find(query); for (Document doc : duplicateDocs) { System.out.println("存在重复病人的文档:" + doc.toJson()); }
你的原始代码问题出在哪?
你之前写的query.append("$in", new BasicDBObject().append("pacientes", idJugador.toString()))是错误的用法:
$in是用来匹配字段值是否在指定列表里的操作符,正确格式是{ "字段名": { "$in": [值1, 值2, ...] } }- 你把
$in作为顶层查询字段,并且值是一个BasicDBObject,完全不符合MongoDB的查询语法,所以根本查不到正确结果。
内容的提问来源于stack exchange,提问作者gonzalovt
相关产品推荐
相关产品推荐

