天天看點

mongonTemplate 的聚合查詢 aggregation

package com.isec.iot.dao.dataanalysis.impl;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.springframework.data.domain.Sort;

import org.springframework.data.domain.Sort.Direction;

import org.springframework.data.mongodb.core.aggregation.Aggregation;

import org.springframework.data.mongodb.core.aggregation.AggregationResults;

import org.springframework.data.mongodb.core.query.Criteria;

import org.springframework.data.mongodb.core.query.Query;

import org.springframework.stereotype.Repository;

import com.isec.iot.dao.dataanalysis.DataMAnalysisDao;

import com.isec.iot.dao.mongodb.MongoDBBaseDao;

import com.isec.iot.entity.CollectionData;

@Repository

public class DataMAnalysisDaoImpl extends MongoDBBaseDao<CollectionData> implements DataMAnalysisDao {

    @Override

    public List<Object> searchCharts(Criteria criteria,String collectionName) {

          //Date date1=new Date();

        //第一個參數将内嵌的隻文檔張開,第二個參數查詢條件,第3個為需要的字段,第四為按哪些字段排序

        Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values"),Aggregation.match(criteria),Aggregation.project("values","time")

                ,Aggregation.sort(Sort.Direction.ASC,"time","values.t"));

        AggregationResults<Object> results=mongoTemplate.aggregate(aggregation,collectionName, Object.class);

        List<Object> objs=results.getMappedResults();

       //Date date2=new Date();

       // System.out.println("===================================dao==========="+(date2.getTime()/1000-date1.getTime()/1000)+"s===========================================================");

        return objs;

    }

   ///每個結構物的餅圖

    @Override

    public List<Map<String, Object>> searchCakes(Criteria criteria, String collectionName) {

        List<Map<String,Object>> list=new ArrayList<>();

        Aggregation aggregation=Aggregation.newAggregation(Aggregation.match(criteria),Aggregation.group("product_name").count().as("count"));

        AggregationResults<Object> results=mongoTemplate.aggregate(aggregation,collectionName, Object.class);

        List<Object> objects=results.getMappedResults();

        for(Object o:objects) {

            Map<String, Object> map=new HashMap<>();

            Map<String, Object> map1=(Map<String, Object>) o;

            map.put("name", map1.get("_id"));//id自動為分組的字段,--------------------單個分組是_id,多個分組則會吧分組字段傳回

            map.put("value", map1.get("count"));

            list.add(map);

        }

        return list;

    }

    ///每個結構物的資料流折線圖

    @Override

    public List<Map<String, Object>> searchStructureOfLine(Criteria criteria, String collectionName) {

        List<Map<String, Object>> list=new ArrayList<>();

        Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values"),

                Aggregation.match(criteria),

                Aggregation.group("time").count().as("count"),Aggregation.sort(Direction.ASC,"_id"));

        AggregationResults<Object> results=mongoTemplate.aggregate(aggregation, collectionName,Object.class);

           List<Object>   objects=results.getMappedResults();

           for(Object object:objects) {

               Map<String, Object > map=new HashMap<>();

               Map<String, Object > map2=(Map<String, Object>) object;

               map.put("name", map2.get("_id"));

               map.put("value", map2.get("count"));

               list.add(map);

           }

        return list;

    }

    @Override

    public List<Object> searchMM(Criteria criteria, String collectionName) {

        List<Object> list=new ArrayList<>();

        Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values")

                ,Aggregation.match(criteria)

                ,Aggregation.group("key").max("values.v").as("max").min("values.v").as("min"));

        AggregationResults<Object> mResults=mongoTemplate.aggregate(aggregation,collectionName,Object.class);

        list=mResults.getMappedResults();

        return list;

    }

    @Override

    public List<Object> searchReleDatas(Criteria criteria, String collectionName) {

        List<Object> list=new ArrayList<>();

        Aggregation aggregation=Aggregation.newAggregation(Aggregation.unwind("values")

                ,Aggregation.match(criteria)

                ,Aggregation.project("time","values")

                ,Aggregation.sort(Sort.Direction.ASC,"time","values.t")

                );

        AggregationResults<Object> mAggregationResults=mongoTemplate.aggregate(aggregation,collectionName, Object.class);

        list=mAggregationResults.getMappedResults();

        return list;

    }

    //查一天的資料

    @Override

    public CollectionData findByQuery(Query query, String collectionName) {

          return mongoTemplate.findOne(query, CollectionData.class,collectionName);

    }

}