java 如何在Sping Boot 中按最大值分组并从MongoDB中获取完整实体?

ryevplcw  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(78)

我是MongoDB的新手,遇到了一些麻烦。如果有人能帮助我,我将非常感激。
我有这样的实体:

class FileRecord {

private ObjectId id;
private String fileId;
private EnumStatus status;
private Long userId;
private Integer year;
etc.

> }

一个文件可以有许多记录,但一年中只能有一个。我需要按条件获取所有最后的文档。
我不知道如何在Spring使它正确,但在mongo查询太,如果说实话)
我明白如何为它制定标准:

var match = match(Criteria.where("userId").in(userIds).andOperator(Criteria.where("status").in(EnumStatus.availableStatues())));

并按最大值分组:

var group = group("fileId", "year").max("year").as("max_year");

但是如何让它在聚合后为我返回Colletion<FileRecord>的一个查询中查询呢?
如果我试着这样做:
变量聚合= newAggregation(过滤器,组);

AggregationResults<FileRecord> aggregateResult = 
mongoOperations.aggregate(aggregation, FileRecord.class, FileRecord.class);
Collection<FileRecord> records = aggregateResult.getMappedResults()

我得到一个异常:

readObjectId can only be called when CurrentBSONType is OBJECT_ID, not when CurrentBSONType is DOCUMENT.;

如果有人有我感兴趣的想法
先谢谢你了

wj8zmpe1

wj8zmpe11#

我找到了答案)

var group = group("fileId", "year").max("year").as("max_year").first("_id").as("enityId");

我需要创建投影,然后再次向数据库发出请求,并通过id获取我需要的数据。我没有太多这样的数据,所以这个解决方案对我很有效。但是,据我所知,您可以“首先”添加很多数据,然后添加您需要的字段。通过一个请求即可获取所有数据

相关问题