一、简要介绍两者的用法
find方法是mongoTemplate提供的简单条件数据查询方法,支持简单条件的查询和结果字段过滤。用法非常简单。
aggregation方法是mongoTemplate提供的管道聚合条件查询方法,支持一些复杂条件、聚合、命令语句,用法相对复杂,返回的结果集包含的信息量也更多。
二、返回结果比较
从返回结果可以看到,两者的返回结果都是List<T>,但略有不同,查看find方法的源码,一直追查到最里层,可以看到实际返回的就是List<T> result = new ArrayList<>()。
查看aggregation的源代码,可以看到实际的返回就是Collection<? super V>,即new ArrayList<>()。
至此,两者的底层接收结果的数据类型并没有太大的区别。唯一的问题在于2199行的 new AggregationResults,查看其具体实现可以看到,传入的Array List被Collections.unmodifiableList了。
三、结论/示例(UnsupportedOperationException)
find方法返回的List是不限制任何操作的。
aggregation方法返回的List是不支持修改的,也就是说结果集被创建后,就不能对其进行添加、删除或修改元素引用的操作,但就某个元素支持对字段的修改。否则就会报错,抛出异常。
例如:当你通过aggregation拿到数据时,再传给EasyPoi做导出操作时,就会报错,提示传入的是一个不可被修改的列表。
java.lang.UnsupportedOperationException: null
at java.util.Collections$unmodifiablecollection$1.remove(collections.java:1044)~[na:1.8.0_144]
at cn.afterturn.easypoi.excel.export.ExcelExportservice.insertDataTosheet(ExcelExportservice.java:255)[easypoi-base-4.0.0.jar:na]
修改后的写法如下(加上第85行):