img

1 findDistinct

在上一篇中说到去重问题,直接使用的是官方的findDistinct,虽然达到了我们去重的目的,但是在开发中是非常不实用的。因为我对他又进行了测试,发现问题如下:

Query query = new Query();
List<User> res = mongoTemplate.findDistinct(query, "age", User.class, User.class);
System.out.println(res);

// 结果
[5, 40, 66, 88]

然后对数据进行降序,然后再去重,代码如下:

Query query = new Query();
query.with(Sort.by(Sort.Order.asc("age")));
List<User> res = mongoTemplate.findDistinct(query, "age", User.class, User.class);
System.out.println(res);

// 结果
[5, 40, 66, 88]

对比2次结果就可以发现问题,这个去重查询的结果,只是单纯的去重,无法对数据进行排序操作,同时返回的字段也是单一,这在我们实际开发中是绝对的冲突,开发中建议使用聚合管道来操作,也就是下面要介绍的东西,实际开发中实用指数100%

2 Aggregation

说起Aggregation可能有人就说TypeAggregation,其实通过源码就可以看出,TypeAggregation是继承了Aggregation,所以他俩的写法大差不差。

image-20240328230807887

直接来一个demo展示效果:

int page = 1;
int pageSize = 20;
List<AggregationOperation> operations = new ArrayList<>();
// 查询
operations.add(Aggregation.match(Criteria.where("name").regex("王")));
// 排序
operations.add(Aggregation.sort(Sort.by(Sort.Order.desc("age"))));
// 要查询的字段
operations.add(Aggregation.project("name"));
// 分页
operations.add(Aggregation.skip((page - 1) * pageSize));
operations.add(Aggregation.limit(pageSize));

Aggregation aggregation = Aggregation.newAggregation(operations);
AggregationResults<User> aggregate = mongoTemplate.aggregate(aggregation, "user", User.class);
List<User> mappedResults = aggregate.getMappedResults();
System.out.println(mappedResults);

上面这一大段,用sql来写就是SELECT name FROM user WHERE name LIKE '%王%' ORDER BY age DESC LIMIT 0,20;',通过sql我相信你能更好的理解,这一段代码的含义,感谢支持!!!

注意:多个Aggregation 是按先后顺序执行的,排在后面的语句在前面的基础上操作,所以顺序不一致可能会报错