0

J'ai eu du mal à écrire pour convertir une commande mongo shell en requête java au-dessus du pilote java mongo afin de l'appeler dans mon projet webapp: la commande est la suivante:MongoDB: comment regrouper par date avec l'agrégation de date mongo en utilisant le pilote 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} 
    } 
} 
) 

la requête ci-dessus sorties résultat dans le format ci-dessous dans le shell 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 
} 

J'échoué par écrit la même requête en java en utilisant le pilote mongo java. ci-dessous est ma requête:

  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; 

retourne un jeu de résultats ci-dessous:

{"result" : [ 
    { "_id" : 19 , "count" : 26} , 
    { "_id" : 18 , "count" : 29} , 
    { "_id" : 17 , "count" : 27} , 
    { "_id" : 16 , "count" : 25} , 
    { "_id" : 15 , "count" : 16} 
      ] , 
"ok" : 1.0} 

J'ai des défis qui font la requête comprennent la partie minute et la partie heure. Comment modifier ma requête pour produire le même jeu de résultats que celui du shell mongo.

Merci de regarder ce

+0

tout le monde !? quelqu'un a largement utilisé les fonctions d'agrégation de groupe mongo avec le pilote Java –

Répondre

1

code Java pour la requête donnée est la suivante:

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"); 
    } 
} 
Questions connexes