java 内物场的Spring mongo模板投影

klsxnrf1  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(97)

我的对象看起来是这样的:

{
  "sourced": { "reference": "a", "otherField: 1 }
  "derived": "Q"
}

我的最终目标是将其简化为:

{
  "reference": "a"
}

并使用distinct删除所有重复项。
到目前为止,我得到了以下工作代码:

@Data
private static class ReducedEntity {
    Sourced sourced;
}

@Data
private static class Sourced {
    private String reference;
}

var aggregation = Aggregation.newAggregation(
        match(new Criteria()),
        Aggregation.project("sourced")
        );
AggregationResults<ReducedEntity> results = mongoTemplate.aggregate(aggregation, collectionName, ReducedEntity.class);
List<ReducedEntity> mappedResult = results.getMappedResults();
return mappedResult.stream().map(book -> book.sourced.reference).collect(Collectors.toList());

它工作,但我更喜欢有一个引用属性的单个类。
一个有趣的观察是

Aggregation.project("sourced.reference")

sourced将返回null。
我试着把“sourced.reference”Map到“reference”,但没有成功。有什么问题谢谢

gojuced7

gojuced71#

使用Aggregation.project("sourced.reference"),您不再需要ReducedEntity类,而是直接使用Sourced类作为聚合中的outputType。

var aggregation = Aggregation.newAggregation(Aggregation.project("sourced.reference"));

AggregationResults<Sourced> results = mongoTemplate.aggregate(aggregation, collectionName, Sourced.class);
return results.getMappedResults().stream().map(Sourced::getReference).collect(Collectors.toList());

相关问题