我正在使用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可以做到吗?
答案 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" } ] } }