1. 程式人生 > >MongoDB的聚合查詢(兩種方式)

MongoDB的聚合查詢(兩種方式)

//原生的
public Map<ObjectId, Long> groupByNative(){
List<ObjectId> questionIdList = distinctByIsRight();


   //過濾條件  
   DBObject queryObject=new BasicDBObject("_id.questionId", new BasicDBObject("$in",questionIdList));  
   DBObject match=new BasicDBObject("$match",queryObject); 

   //分組統計  
   DBObject groupObject=new BasicDBObject("_id",new BasicDBObject("questionId","$questionId"));  
   groupObject.put("docsNum", new BasicDBObject("$sum",1));  
   DBObject  group=new BasicDBObject("$group",groupObject);
   
   //排序
   DBObject sortObject = new BasicDBObject("docsNum", -1); 
   DBObject  sort=new BasicDBObject("$sort",sortObject);
   //查詢
        AggregationOutput output = mirrorAnswerDao.group("MirrorAnswer", group, match, sort);
        
        Map<ObjectId, Long> countMap = new LinkedHashMap<ObjectId, Long>();
        for( Iterator< DBObject > it = output.results().iterator(); it.hasNext(); ){
            BasicDBObject dbo = ( BasicDBObject ) it.next();
            BasicDBObject keyValus = (BasicDBObject)dbo.get("_id");
            ObjectId questionId = keyValus.getObjectId("questionId");
            long docsNum = ((Integer)dbo.get("docsNum")).longValue();
            countMap.put(questionId, docsNum);
        }
        
        return countMap;

}

//返回

{
  "_id": {
    "questionId": {
      "$oid": "58f18d650cf29eb80944bac7"
    }
  },
  "docsNum": 79
}

//原生的mongodb查詢語句
@SuppressWarnings("deprecation")
public AggregationOutput group(String collectionName, DBObject group, DBObject match, DBObject sort){
        AggregationOutput output = finalTemplate.getCollection(collectionName).aggregate(group, match, sort);
        return output;
}

//Spring Data MongoDB隆重登場
public Map<ObjectId, Long> groupBySpringDataMongoDB(){
List<ObjectId> questionIdList = distinctByIsRight();
Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("questionId").in(questionIdList)),
                Aggregation.group("questionId").count().as("sum"),
                Aggregation.sort(Direction.DESC, "sum")
        );
List<BasicDBObject> iteratorList = mirrorAnswerDao.aggregate(agg, BasicDBObject.class);


Map<ObjectId, Long> countMap = new LinkedHashMap<ObjectId, Long>();
        for (Iterator<BasicDBObject> iterator = iteratorList.iterator(); iterator.hasNext();) {  
        BasicDBObject obj =iterator.next();  
        ObjectId questionId = obj.getObjectId("_id");
        long sum = obj.getLong("sum");
        countMap.put(questionId, sum);
        }
        return countMap;
}

public <R> List<R> aggregate(Aggregation aggregation, Class<R> aggregationResultClass) {
AggregationResults<R> groupResults = finalTemplate.aggregate(aggregation, entityClass, aggregationResultClass);
List<R> result = groupResults.getMappedResults();
return result;
}

{
  "aggregate": "__collection__",
  "pipeline": [
    {
      "$match": {
        "questionId": {
          "$in": [
            {
              "$oid": "59dc6ad90cf296ba6ef4d8ca"
            },
            {
              "$oid": "59dc7a530cf28dfe7d216baa"
            },
            {
              "$oid": "58fdce620cf27bc8873d95a0"
            },
            {
              "$oid": "594736a90cf2de6563db59de"
            },
            {
              "$oid": "59c4cc8d0cf2f400b00878f2"
            },
            {
              "$oid": "59cb4c4c0cf2e16fc2fb2c72"
            },
            {
              "$oid": "59ccb7750cf2a8c83743222a"
            },
            {
              "$oid": "59cda1a60cf2a8c837432270"
            },
            {
              "$oid": "59cda5ea0cf2a8c837432278"
            },
            {
              "$oid": "59cdad030cf2a8c83743228b"
            },
            {
              "$oid": "59db0d0f0cf2b5dfabc73417"
            },
            {
              "$oid": "59db841a0cf296ba6ef4d845"
            },
            {
              "$oid": "58f0d9a80cf29eb80944baab"
            },
            {
              "$oid": "58f18d650cf29eb80944bac7"
            },
            {
              "$oid": "58f18fd10cf29eb80944baf1"
            },
            {
              "$oid": "58f5ba930cf21561f2ce97c9"
            },
            {
              "$oid": "58f5d9f90cf21561f2ce9903"
            },
            {
              "$oid": "58f70c630cf257d0acb3bb35"
            },
            {
              "$oid": "58f867dc0cf25030f2717067"
            },
            {
              "$oid": "59dec6160cf28dfe7d216c5e"
            },
            {
              "$oid": "59e022150cf25676e95aac06"
            },
            {
              "$oid": "59e022670cf25676e95aac0f"
            },
            {
              "$oid": "59e029660cf25676e95aac5c"
            },
            {
              "$oid": "59cc8ee00cf29002da4f5e87"
            },
            {
              "$oid": "59e026720cf25676e95aac38"
            },
            {
              "$oid": "59fbc23c0cf258572ba5438d"
            }
          ]
        }
      }
    },
    {
      "$group": {
        "_id": "$questionId",
        "sum": {
          "$sum": 1
        }
      }
    },
    {
      "$sort": {
        "sum": -1
      }
    }
  ]
}