我一直在努力编写将mongo shell命令转换为java mongo驱动程序之上的java查询,以便在我的webapp项目中调用它:命令如下:
db.post.aggregate(
{
$match: { dateCreated:
{
"$gt": new ISODate("2013-08-09T05:51:15.000Z"),
"$lt": new ISODate("2013-08-09T05:51:20.000Z")
}
}
},
{
$group: {
_id: {
hour: {$hour: "$dateCreated"},
minute: {$minute: "$dateCreated"},
second: {$second: "$dateCreated"}
},
cnt: {$sum : 1}
}
}
)
上面的查询在mongo shell中输出以下格式:
{
"result" : [
{
"_id" : {
"hour" : 5,
"minute" : 51,
"second" : 19
},
"cnt" : 26
},
{
"_id" : {
"hour" : 5,
"minute" : 51,
"second" : 18
},
"cnt" : 29
},
{
"_id" : {
"hour" : 5,
"minute" : 51,
"second" : 17
},
"cnt" : 27
},
{
"_id" : {
"hour" : 5,
"minute" : 51,
"second" : 16
},
"cnt" : 25
},
{
"_id" : {
"hour" : 5,
"minute" : 51,
"second" : 15
},
"cnt" : 16
}
],
"ok" : 1
}
我使用java mongo驱动程序在java中编写相同的查询失败了。以下是我的疑问:
DBObject matchStart = new BasicDBObject("$match",new BasicDBObject("dateCreated",new BasicDBObject("$gt",startTime).append("$lt",endTime)));
DBObject field = new BasicDBObject("dateCreated",1);
field.put("h", new BasicDBObject("$hour","$dateCreated"));
field.put("m", new BasicDBObject("$minute","$dateCreated"));
field.put("s", new BasicDBObject("$second","$dateCreated"));
DBObject project = new BasicDBObject("$project",field);
DBObject groupField = new BasicDBObject("_id","$s");
groupField.put("count", new BasicDBObject("$sum",1));
DBObject group = new BasicDBObject("$group",groupField);
AggregationOutput output = mongoOperations.getCollection("post").aggregate(matchStart,project,group);
return output;
它返回以下结果集:
{"result" : [
{ "_id" : 19 , "count" : 26} ,
{ "_id" : 18 , "count" : 29} ,
{ "_id" : 17 , "count" : 27} ,
{ "_id" : 16 , "count" : 25} ,
{ "_id" : 15 , "count" : 16}
] ,
"ok" : 1.0}
我遇到了挑战,使查询包括分钟部分和小时部分。如何调整我的查询以输出与mongo shell中相同的结果集。
感谢您查看
答案 0 :(得分:1)
给定查询的Java代码如下:
DBCollection coll = ...
Date startDate = ...
Date endDate = ...
DBObject dateQuery = new BasicDBObject();
dateQuery.put("$gt", startDate);
dateQuery.put("$lt", endDate);
DBObject match = new BasicDBObject();
match.put("dateCreated", dateQuery);
DBObject id = new BasicDBObject();
id.put("hour", new BasicDBObject("$hour", "$dateCreated"));
id.put("minute", new BasicDBObject("$minute", "$dateCreated"));
id.put("second", new BasicDBObject("$second", "$dateCreated"));
DBObject group = new BasicDBObject();
group.put("_id", id);
group.put("cnt", new BasicDBObject("$sum", 1));
AggregationOutput output = coll.aggregate(new BasicDBObject("$match", match), new BasicDBObject("$group", group));
if (output != null) {
for (DBObject result : output.results()) {
Integer count = (Integer) result.get("cnt");
DBObject idObj = (DBObject) result.get("_id");
Integer hour = (Integer) idObj.get("hour");
Integer minute = (Integer) idObj.get("minute");
Integer second = (Integer) idObj.get("second");
}
}