0

Я пытался писать для преобразования команды оболочки mongo в Java-запрос поверх драйвера java mongo, чтобы вызвать его в моем проекте webapp: команда состоит в следующем:MongoDB: как сгруппировать по дате с агрегированием даты mongo с помощью java-драйвера

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 оболочки:

{ 
"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, используя драйвер Java MONGO. Ниже мой запрос:

  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; 

он возвращает ResultSet ниже:

{"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.

Спасибо за глядя на эту

+0

кого !? кто-нибудь широко использовал функции агрегации групп монга с java-драйвером –

ответ

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"); 
    } 
} 
Смежные вопросы