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
,所以他俩的写法大差不差。
直接来一个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 是按先后顺序执行的,排在后面的语句在前面的基础上操作,所以顺序不一致可能会报错