1. 程式人生 > >java-mongo複雜管道聚合aggregate的填坑之路(分頁、allowDiskUse、統計)

java-mongo複雜管道聚合aggregate的填坑之路(分頁、allowDiskUse、統計)

List<DBObject> aggregateQuery = new ArrayList<DBObject>();
BasicDBObject groupHeapNum = new BasicDBObject("heapNum","$heapNum");
BasicDBObjectBuilder groupBuilder = new BasicDBObjectBuilder();
groupBuilder.add("_id", groupHeapNum);
//獲取組內釋出時間最新的資料
groupBuilder.add("publishDate", new BasicDBObject("$max","$publishDate"));
//獲取組內釋出時間最新的資料
groupBuilder.add("heapNum", new BasicDBObject("$first","$heapNum"));
groupBuilder.add("count", new BasicDBObject("$sum",1));
// 分組 每組的重複次數
aggregateQuery.add(new BasicDBObject("$group",groupBuilder.get()));
aggregateQuery.add(new BasicDBObject("$sort",new BasicDBObject("count",-1)));//排序
		
//分組後 總數大於1的,且含查詢條件
BasicDBObjectBuilder matchBuilder = new BasicDBObjectBuilder();
matchBuilder.add("count", new BasicDBObject("$gt",1));
if(beginDate!=null && endDate!=null) {
	BasicDBObjectBuilder publishDateBuilder = new BasicDBObjectBuilder();
	publishDateBuilder.add("$gte",beginDate);
	publishDateBuilder.add("$lte",endDate);
	matchBuilder.add("publishDate", publishDateBuilder.get());
}
aggregateQuery.add(new BasicDBObject("$match",matchBuilder.get()));
aggregateQuery.add(new BasicDBObject("$skip",pageSize*(currentPage-1)));
aggregateQuery.add(new BasicDBObject("$limit",pageSize));

AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();

DBCollection collection = mongoTemplate.getDb().getCollection(collectionName);
Cursor cursor = collection.aggregate(aggregateQuery,aggregationOptions);

while(cursor .hasNext()){//查出每個的資訊
DBObject next = cursor .next();
String heapNum = next.get("heapNum").toString();
。。。。。。
}
if(aggregateCursor!=null) {
aggregateCursor.close();
}