如何通过Criteria查询匹配GeneticId列表的GeneAdditionalInfo数据
问题排查:基于GeneticId查询MongoDB数据无结果
核心问题分析
现有代码从GeneticInfo列表提取GeneticId后,通过MongoTemplate查询GeneAdditionalnfo列表未返回预期结果,以下是关键排查点及修复方案:
1. 实体类拼写与MongoDB映射缺失
- 类名拼写错误:业务描述中目标数据类为
GeneAdditionalInfo,但代码中定义为GeneAdditionalnfo(少字母i),导致Spring Data无法正确匹配MongoDB集合。 - 映射注解缺失:
GeneAdditionalnfo未添加@Document注解,Spring无法识别其对应MongoDB集合;同时未定义与GeneticId匹配的字段(复合键或嵌套ID),无法与数据库结构对齐。
2. 查询条件构建错误
当前直接将Java对象GeneticId传入in条件,MongoDB无法识别该对象结构,需根据数据库存储形式调整:
- 若数据库用复合字段存储标识(
genderCode和geneGroupId为独立字段),构建组合条件:Criteria criteria = new Criteria().andOperator( Criteria.where("genderCode").in(geneticIds.stream().map(GeneticId::getGenderCode).toList()), Criteria.where("geneGroupId").in(geneticIds.stream().map(GeneticId::getGeneGroupId).toList()) ); - 若数据库用嵌套ID对象存储(
id字段包含genderCode和geneGroupId),将GeneticId转为Mongo可识别的Map:List<Map<String, Object>> idMaps = geneticIds.stream() .map(id -> { Map<String, Object> map = new HashMap<>(); map.put("genderCode", id.getGenderCode()); map.put("geneGroupId", id.getGeneGroupId()); return map; }) .toList(); Criteria criteria = new Criteria("id").in(idMaps);
3. 数据库连接配置问题
业务明确GeneAdditionalInfo存储在独立数据库,需确认当前MongoTemplate是否指向该数据库(而非GeneticInfo所在库)。可通过@Qualifier注入对应数据库的MongoTemplate实例,或检查配置文件中的数据库名称。
4. 实体类修正示例
修正类名与MongoDB映射:
@Data @Document(collection = "geneAdditionalInfo") // 指定对应集合名 public class GeneAdditionalInfo { // 修正类名 @Id private GeneticId id; // 对应MongoDB中的嵌套ID结构 private String classification; private String type; }
修正后的完整业务代码
@Service @RequiredArgsConstructor public class GeneticInfoQueryService { // 确保此MongoTemplate指向GeneAdditionalInfo所在的独立数据库 private final MongoTemplate mongoTemplate; public List<GeneAdditionalInfo> findAdditionCharacteristics(List<GeneticInfo> geneticInfoList) { List<GeneticId> geneticIds = geneticInfoList.stream() .map(GeneticInfo::getGeneticId) .toList(); List<Map<String, Object>> idMaps = geneticIds.stream() .map(id -> { Map<String, Object> map = new HashMap<>(); map.put("genderCode", id.getGenderCode()); map.put("geneGroupId", id.getGeneGroupId()); return map; }) .toList(); Query query = Query.query(Criteria.where("id").in(idMaps)); return mongoTemplate.find(query, GeneAdditionalInfo.class); } }
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

