在上篇博文中,我通过封装的一个Java接口实现了MongoDB的Group功能,但是没有讲怎么根据日期Date查询,这里补充一下,如何完善MongoDB的日期Group功能。
在实现Group功能时,通常还要附带一些条件,查询分组时只查询状态为已完成的或者未完成的,再或者查询某个日期时间段内符合条件的分组。这时候,如果在Reduce中设置符合条件的日期再计数,你会发现MongoDB完全忽略了日期。为什么?因为语法不对。
在MongoDB中查询特定条件的分组时,应该把这些条件放到Condition中,具体怎么做,还是看下面的代码吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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;
}
|
本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1313959,如需转载请自行联系原作者