MongoDB聚合操作例項(基於SpringBoot 整合MongoDB)
轉載務必說明出處:https://blog.csdn.net/LiaoHongHB/article/details/83579030
spring boot整合mongdb,其中的mongodbTemplate只有一些簡單的方法對mongodb資料進行基本的增刪改查,對於一些複雜的查詢條件通過Aggregation聚合函式來操作。
1、匯入jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2、建立MongoDao介面和該介面實現類
public class MongoDaoImpl<T> implements MongoDao<T> { /** * 日誌 */ private static final Logger LOGGER = LoggerFactory.getLogger(MongoDaoImpl.class); @Autowired protected MongoTemplate mongoTemplate; /** * clazz */ private Class<T> clazz; public MongoDaoImpl() { try { ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass(); clazz = (Class<T>) type.getActualTypeArguments()[0]; LOGGER.info("reflect Class:{}", clazz); } catch (Exception e) { LOGGER.error("MongoDaoImpl reflection happen error:{}", e); } }
3、聚合方法例項
/** * 分組查詢 * * @param pageNum 頁數 * @param pageSize 每頁記錄數 * @param criteria1 查詢條件1 * @param criteria2 查詢條件2 * @param field1 分組屬性1 * @param field2 分組屬性2 * @param sort 排序 * @param collectionName mongdb表的名字 * @return * @throws BbsException */ @Override public AggregationResults<T> aggregation(int pageNum, int pageSize, Criteria criteria1, Criteria criteria2,String field1, String field2, String sortName, Sort sort, String collectionName) throws BbsException { Aggregation aggregation = Aggregation.newAggregation( Aggregation.match(criteria1), Aggregation.match(criteria2), Aggregation.group(field1, field2).last(sortName).as(sortName), Aggregation.sort(sort), Aggregation.skip((pageNum - 1) * pageSize), Aggregation.limit(pageSize) ); return mongoTemplate.aggregate(aggregation, collectionName, clazz); }
需求示例:查詢使用者評論的帖子並且該帖子沒有被刪除;並且按照時間倒序進行分頁顯示;
Aggregation.match(criteria1):指的是查詢條件,這裡可以有兩個查詢條件(使用者的id和帖子的狀態) Aggregation.group(field1, field2).last(sortName).as(sortName):group是指根據表中的若干個屬性進行分組查詢 (這裡根據兩個屬性,一個是帖子id,另一個是帖子型別);last是指保留最後一條評論的記錄(也就是對某個帖子有 多條評論的話保留最新一條評論記錄);as是指將表中的某個屬性對映到一個別名,由於這裡要根據評論的時間排 序,所以這裡的屬性為評論時間屬性欄位;
Aggregation.sort是指根據排序條件進行排序,這裡根據評論時間進行排序;
Aggregation.skip和Aggregation.limit則是分頁的操作;
說明:在上述示例中,只根據了兩個屬性進行group,那麼返回的結果集合也只有這兩個屬性有值,該表中其他的欄位為null
如果要根據某欄位排序,則要在last中新增該屬性即可 。
去重:mongodb中的去重方法是Aggregation.distinct(去重欄位),不過該方法只能對一個欄位去重,多個欄位去重就參照上面 的group方法,去重之後的結果集合也只有去重欄位有值,其他欄位為null。