java 在Spring MongoDB上选择多个字段的不同查询

ldioqlga  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(126)

我在Mongo系列中有一个User模型,看起来像这样:

用户类

@Id
private String userId;
private String userName;
private String organizationId;
private String organizationName;
private String status

我需要得到一个OrganizationDTO的列表作为响应发送到前端。DTO的形状如下:

组织DTO类

private String organizationId;
private String organizationName;

但在集合中,不同的用户显然有可能具有相同的organizationId和organizationName,因此我只想将它们列出一次。OrganizationDTO列表应包含每个不同的organizationId/Name,它们的状态包含在我选择的集合中。
如果需要的话,我很乐意补充所有可能有用的信息。
我尝试使用mongoTemplate.findDistinct(),但它显然不是我所寻找的解决方案,我找到的过于复杂的“解决方案”是这样的:

Query orgIdListQuery = new Query().addCriteria(
  Criteria.where("status").in(statusList)
);

List<String> organizationIdList = mongoTemplate.findDistinct(orgIdListQuery, "organizationId", User.class, String.class);

List<String> organizationNameList = mongoTemplate.findDistinct(orgIdListQuery, "organizationName", User.class, String.class);

// Map the two lists to get a single one with both fields, obtaining a list of OrganizationDTO

但我一点也不喜欢它,所以我尝试使用聚合:

MatchOperation match = new MatchOperation(getCriteria(statusList));  //getCriteria returns the Criteria as above
GroupOperation group = new GroupOperation(Fields.fields("organizationId", "organizationName"));
Aggregation aggregation = Aggregation.newAggregation(match, group);
AggregationResults<OrganizationDTO> results = mongoTemplate.aggregate(aggregation, User.class, OrganizationDTO.class);
return results.getMappedResults();

看起来我已经接近正确的实现了,但是目前的结果是一个包含一些空对象的List。一旦聚合正确,这是正确的解决方案吗?或者可能有更好的解决方案。

nbysray5

nbysray51#

我认为问题可能是结果无法序列化到您的OrganizationDTO中,因此您可以尝试将$project阶段添加到聚合中,类似于以下内容(未测试):

ProjectionOperation project = Aggregation.project().andExclude("_id").and("organizationId").nested(Fields.fields("_id.organizationId")).and("organizationName").nested(Fields.fields("_id.organizationName"));
Aggregation aggregation = Aggregation.newAggregation(match, group, project);

现在的结果就像DTO一样,并且可以Map,所以现在不应该是空对象。

相关问题