我在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。一旦聚合正确,这是正确的解决方案吗?或者可能有更好的解决方案。
1条答案
按热度按时间nbysray51#
我认为问题可能是结果无法序列化到您的
OrganizationDTO
中,因此您可以尝试将$project
阶段添加到聚合中,类似于以下内容(未测试):现在的结果就像DTO一样,并且可以Map,所以现在不应该是空对象。