本文共 1729 字,大约阅读时间需要 5 分钟。
在上篇博文中,我通过封装的一个Java接口实现了MongoDB的Group功能,但是没有讲怎么根据日期Date查询,这里补充一下,如何完善MongoDB的日期Group功能。
在实现Group功能时,通常还要附带一些条件,查询分组时只查询状态为已完成的或者未完成的,再或者查询某个日期时间段内符合条件的分组。这时候,如果在Reduce中设置符合条件的日期再计数,你会发现MongoDB完全忽略了日期。为什么?因为语法不对。
在MongoDB中查询特定条件的分组时,应该把这些条件放到Condition中,具体怎么做,还是看下面的代码吧。
public String getCTOStatistic() throws Exception { String ctoTaskType = getParameterValue("ctoTaskType").toString(); String startDate = getParameterValue("startDate").toString(); String endDate = getParameterValue("endDate").toString(); DBObject initial = new BasicDBObject(); DBObject index = new BasicDBObject(); BasicDBObject cond = new BasicDBObject(); BasicDBObject dateCondition = new BasicDBObject(); index.put("count", 0); index.put("ctoPerson", ""); initial.put("ctoPerson", index); cond.put("ctoStatus", "Finished"); if(StringUtils.isNotEmpty(ctoTaskType)){ cond.put("taskId", ctoTaskType); } if(StringUtils.isNotEmpty(startDate)){ dateCondition.append("$gte", DateUtil.toDate(startDate)); } if(StringUtils.isNotEmpty(endDate)){ dateCondition.append("$lt", DateUtil.toDate(endDate)); } cond.put("jobCreateTime",dateCondition); String reduce = "function (doc, out) { " + " out.ctoPerson.count = out.ctoPerson.count+=1; " + " out.ctoPerson.ctoPerson = doc.ctoPerson;" + "}"; BasicDBList group = (BasicDBList) ctoJobService.group( new String[] { "ctoPerson"}, cond, initial, reduce, null); this.jsonResult = group.toString(); return SUCCESS; }
转载地址:http://pqfox.baihongyu.com/