Spring Boot:从MongoDB文档获取对象?

时间:2019-05-23 13:12:33

标签: mongodb spring-boot

我正在使用Spring Boot 2.1.3.RELEASE和MongoDB。而且我正在寻找一种检索文档的一部分的方法。

存储库:

@Repository
public interface CompanyRepository extends MongoRepository<Company, String> {
}

对象:

@Data
@Document
public class Company {

  public GeneralInfo info;
  public Map<String, List<Employee>> officeIdEmployeeMap;

  @Data
  public class GeneralInfo {
    @Id
    public String companyId;
    public String name;
  }

  @Data
  public class Employee {
    public String firstName;
    public String lastName;
  }
}

我只需要获取GeneralInfo个对象,然后如果满足某些条件,则从List<Employee>中获取officeIdEmployeeMap,而不是整个地图。 MongoRepository可以做到吗?

2 个答案:

答案 0 :(得分:0)

这可以通过MongoTemplate实现。

finalString officeName = "IT";
final Query query = new Query();
query.addCriteria(Criteria.where("officeIdEmployeeMap." + officeName).exists(true));
query.fields().exclude("officeIdEmployeeMap");

final Company company = mongoTemplate.findOne(query, Company.class, "collection");

这将返回Company对象,但只会设置GeneralInfo

答案 1 :(得分:0)

CompanyRepository中添加以下方法:

@Query(value="{}", fields = "{'info':1}")
public List<Company> getCompanies();

仅在需要获取常规信息时调用此方法,否则,请致电findAll()以获取所有详细信息。您可以在存储库中编写新的查询,以限制所选字段和条件(可选)。

如果您想有条件地在同一查询中实现这两种情况(仅获取GeneralInfo并同时获取这两种情况),而不是使用注解创建一个如下查询:

@Autowired
private MongoTemplate mongoTemplate;

Query query = new Query();
boolean someCondition = true; // Put your condition here
if(someCondition) {
    query.fields().exclude("officeIdEmployeeMap");
}
return mongoTemplate.find(query, Company.class);

假定数据库中的公司数据如下:

{ "_id" : ObjectId("5d3afb75b2ebf8a9ec2f906f"), "info" : { "companyId" : "1", "name" : "abc" }, "officeIdEmployeeMap" : { "g1" : [ { "firstName" : "A", "lastName" : "B" }, { "firstName" : "C", "lastName" : "D" } ] } }