基于SpringBoot+MongoDB,如何通过子文档ID查询主文档?
SpringBoot整合MongoDB:通过子文档ID查询主文档
我们的MongoDB文档结构如下:
[{ "id": "classicId", "name": "classicName", "models": [ { "id": "AnotherId", "name": "AnotherSomeName" }, { "id": "RequiredId", "name": "SomeName" } ] }]
其中models数组内的id字段具有唯一性,现在需要通过给定的子文档id(如"AnotherId")查询对应的主文档,以下是两种实现方式:
1. 定义实体类
首先创建对应文档结构的Java实体类:
Model.java
public class Model { private String id; private String name; // 构造方法、getter和setter省略 }
Classic.java
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.util.List; @Document(collection = "classics") // 替换为你的集合名 public class Classic { @Id private String id; private String name; private List<Model> models; // 构造方法、getter和setter省略 }
2. 使用MongoTemplate实现
通过MongoTemplate构造查询条件,直接匹配嵌套数组中的id字段:
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; @Service public class ClassicService { private final MongoTemplate mongoTemplate; public ClassicService(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public Classic getClassicByModelId(String modelId) { Query query = new Query(Criteria.where("models.id").is(modelId)); return mongoTemplate.findOne(query, Classic.class); } }
3. 使用MongoRepository实现
方式一:派生查询方法
直接在Repository接口中定义符合Spring Data MongoDB命名规则的方法:
import org.springframework.data.mongodb.repository.MongoRepository; public interface ClassicRepository extends MongoRepository<Classic, String> { Classic findByModelsId(String modelId); }
方式二:@Query注解自定义查询
如果需要更灵活的查询逻辑,可使用@Query注解编写MongoDB查询语句:
import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; public interface ClassicRepository extends MongoRepository<Classic, String> { @Query("{ 'models.id' : ?0 }") Classic findByModelId(String modelId); }
之后在业务类中注入ClassicRepository即可调用上述方法:
import org.springframework.stereotype.Service; @Service public class ClassicService { private final ClassicRepository classicRepository; public ClassicService(ClassicRepository classicRepository) { this.classicRepository = classicRepository; } public Classic getClassicByModelId(String modelId) { return classicRepository.findByModelsId(modelId); // 或者使用注解方式的方法:classicRepository.findByModelId(modelId); } }
内容的提问来源于stack exchange,提问作者Khushal Singh
相关产品推荐
相关产品推荐

