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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:40:59