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
}
}
]
}