MongoTemplate分组排序取第⼀条记录MongoTemplate分组排序取第⼀条记录
在开发过程中,竟然遇到这样⼀个需求,按照某⼀个字段或者某个查询条件进⾏分组。分组后取其最新的⼀条数据。
例如:在查询⽂件版本时,要求根据⽂件路径filePath分组,表⽰每⼀组都是同⼀个⽂件,只是版本不同。分组后,每组取出版本号最⾼(即最新)的⼀个。
⽬前在⽹上找到的可⾏的代码如下,Aggregates.match⽬前只⽀持对某个字段过滤,⽀持多条件查询暂时不知如何处理。
public List<StreamFile>findRootChildrenByStreamId(String projectId, String streamId, String parentId){
AggregateIterable<Document> aggregateIterable = Template(projectId).CollectionName(StreamFile.class))
.aggregate(Arrays.asList(
// 按照parentId列表过滤记录
Aggregates.match(Filters.in(StreamFile.FIELD_parentId, streamId)),
// 按照version降序排序
Aggregates.sort(new Document().append(StreamFile.FILED_version,-1)),
// 根据orderId分组
new Document("_id","$"+StreamFile.FILED_fullPath),
usb启动盘制作
Arrays.asList(
粗壮造句// 取分组第⼀条数据,即version最⼤的那条,放到doc字段⾥,供后续的replaceRoot替换⽤
一百条裙子Accumulators.first("doc","$$ROOT"))
),
// 如果你的API中有placeRoot,直接使⽤就可以了
问问题英语
如何说话
)
);
List<StreamFile> list =new ArrayList<>();
for(Document document : aggregateIterable){
// 遍历document进⾏处理
Object streamID = (StreamFile.FILED_streamId);
Object parentID = (StreamFile.FIELD_parentId);
Object fullPath = (StreamFile.FILED_fullPath);
Object version = (StreamFile.FILED_version);
南瓜做法
StreamFile streamFile =new StreamFile();
streamFile.tStreamId((String) streamID);鱼和豆腐
streamFile.tParentId((String) parentID);
丰收在望打一字
streamFile.tFullPath((String) fullPath);
streamFile.tVersion((Integer) version);
list.add(streamFile);
}
return list;
}