1.设置需要查询统计的字段,以聚合运算符"$project"为key值放入DBObject中。
BasicDBObject projectFields = new BasicDBObject();
//设置为"1"为启用。
projectFields.put("result", 1);
DBObject project = new BasicDBObject("$project", projectFields);
2.设置需要过滤的查询条件,以聚合运算符"$match"为key值放入DBObject中。
BasicDBObject matchObject=new BasicDBObject();
//限制结束时间为当前时间,过期不查询。
Date d = new Date();
SimpleDateFormat sdf = DateConstants.DATE_FORMAT();
String todayDate = sdf.format(d);
DBObject query1 = new BasicDBObject("EndTime", "");
DBObject query2 = new BasicDBObject("EndTime", new BasicDBObject("$exists", false));
DBObject query3 = new BasicDBObject("EndTime", new BasicDBObject("$gte", todayDate));
matchObject.put("$or", new DBObject[]{query1, query2, query3});
DBObject match = new BasicDBObject("$match",matchObject);
3.进行分组聚合统计,以聚合运算符"$group"为key值放入DBObject中。
BasicDBObject groupFields = new BasicDBObject();
//设置用来分组的字段,以聚合运算符"_id"设置用于分组的主键。
groupFields.put("_id", new BasicDBObject("Id", "$Id"));
// 总数
groupFields.put("total", new BasicDBObject("$sum", 1));
// 总数
BasicDBObject if2 = new BasicDBObject($"eq", new Object[]{"$status", NamesStatus.CALLED.value});
Object[] arr2 = {if2, 1, 0};
groupFields.put("totalExecute", new BasicDBObject("$sum", new BasicDBObject("$cond", arr2)));
// 总数
BasicDBObject if3 = new BasicDBObject("$eq", new Object[]{"$isConnect", IsConnect.CONNECTED.value});
Object[] arr3 = {if3, 1, 0};
groupFields.put("totalConnect", new BasicDBObject("$sum", new BasicDBObject("$cond", arr3)));
// 总数
groupFields.put("totalCallNum", new BasicDBObject("$sum", "$Num"));
/ /数量统计
BasicDBObject ifs1 = new BasicDBObject("$ifNull", new Object[]{"$Result", false});
BasicDBObject ifs2 = new BasicDBObject("$ne", new Object[]{"$Result", ""});
Object[] arrs1 = {ifs1, ifs2};
BasicDBObject ifs3 = new BasicDBObject("$and", arrs1);
Object[] arrs2 = {ifs3, 1, 0};
groupFields.put("totalConnectResult", new BasicDBObject("$sum", new BasicDBObject("$cond", arrs2)));
System.out.println(new BasicDBObject("$sum", new BasicDBObject("$cond", arrs2)));
4.放进管道中。
List<DBObject> pipeline = new ArrayList<DBObject>();
pipeline.add(match); // (Stage 1).加入过滤条件
pipeline.add(project); // (Stage 2).加入入需要字段
pipeline.add(group); // (Stage 3).进行分组,聚合统计
5.执行局和管道统计。
AggregationOutput ag = this.getMongoTemplate().getCollection(ColletionName.NAMES.getCollectionName(entId)).aggregate(pipeline);
6.对执行统计结果进行加工。
Iterator<DBObject> ito = ag.results().iterator();
List<DBObject> list = new ArrayList<DBObject>();
while (ito.hasNext()) {
BasicDBObject db = (BasicDBObject) ito.next();
DBObject dbo = new BasicDBObject();
DBObject keys = (DBObject) db.get("_id");
dbo.put("Id", keys.get("Id"));
list.add(dbo);
}