1. 程式人生 > >MongoDB聚合操作例項(基於SpringBoot 整合MongoDB)

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.skipAggregation.limit則是分頁的操作;

說明:在上述示例中,只根據了兩個屬性進行group,那麼返回的結果集合也只有這兩個屬性有值,該表中其他的欄位為null

          如果要根據某欄位排序,則要在last中新增該屬性即可 。

去重:mongodb中的去重方法是Aggregation.distinct(去重欄位),不過該方法只能對一個欄位去重,多個欄位去重就參照上面             的group方法,去重之後的結果集合也只有去重欄位有值,其他欄位為null。