java mongo 去重_java使用mongoTemplate去重排序查询

本文介绍了三种在Java中使用MongoTemplate进行数据去重并排序的方法。第一种方法是通过findDistinct实现去重,但不支持排序;第二种和第三种方法通过aggregate方法结合分组和排序实现去重并支持排序,其中第二种方法更推荐使用。
摘要由CSDN通过智能技术生成

import org.springframework.data.mongodb.core.MongoTemplate;

import org.springframework.data.mongodb.core.aggregation.Aggregation;

import org.springframework.data.mongodb.core.aggregation.AggregationResults;

import org.springframework.data.mongodb.core.aggregation.TypedAggregation;

第一种,使用mongoTemplate.findDistinct去重,不支持排序,即使你的query条件带sort排序方法。mongoTemplate.findDistinct去重,会使排序失效。优点:查询效率高

缺点:只返回单一字段。不可多字段返回。不能使用排序,不推荐使用

Query query = new Query();

query.addCriteria(Criteria.where("deviceId").is(getListParam.getDeviceId())).with(Sort.by(Sort.Order.desc("startDate")));

List list = mongoTemplate.find(query, RedPacketDeviceRelation.class);

List activeCodes = mongoTemplate.findDistinct(query, "activeCode", "redPacketDeviceRelation",RedPacketDeviceRelation.class, RedPacketDeviceRelation.class);

第二种,使用mongoTemplate.aggregate去重,支持排序。推荐使用

优点:可指定返回类型。支持排序

缺点:排序是查询效率会变的非常低

TypedAggregation tagg = TypedAggregation.newAggregation(RedPacketDeviceRelation.class,

Arrays.asList(

//筛选条件

TypedAggregation.match(Criteria.where("deviceId").is(getListParam.getDeviceId())),

//分组过滤条件,first,as里最后包含展示的字段

TypedAggregation.group("activeCode").first("activeCode").as("activeCode").first("startDate").as("startDate"),

//挑选需要字段

TypedAggregation.project("activeCode", "startDate"),

//排序字段

TypedAggregation.sort(Sort.by(Sort.Order.desc("startDate")))

)

);

AggregationResults result111 = mongoTemplate.aggregate(tagg, RedPacketDeviceRelation.class);

List rd = result111.getMappedResults();

log.debug("排序后的mongoTemplate.group列表1:"+rd);

第三种,用法和第二种类似

Aggregation agg = Aggregation.newAggregation(

// 挑选所需的字段,类似select *,*所代表的字段内容

Aggregation.project("activeCode", "startDate","packetType"),

// sql where 语句筛选符合条件的记录

Aggregation.match(Criteria.where("deviceId").is(getListParam.getDeviceId())),

// 分组条件,设置分组字段

Aggregation.group("activeCode").first("activeCode").as("activeCode").first("startDate").as("startDate"),

// 排序(根据某字段排序 倒序)

Aggregation.sort(Sort.Direction.DESC,"startDate"),

// 重新挑选字段

Aggregation.project("activeCode")

);

AggregationResults results = mongoTemplate.aggregate(agg, "redPacketDeviceRelation", JSONObject.class);

List a= results.getMappedResults();

log.debug("排序后的code列表2:[{}]",results);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值