mongodb摸索学习小记——简单的聚合管道统计整理

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);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值