web-dev-qa-db-fra.com

Requête Java / MongoDB par date

J'ai stocké une valeur en tant que Java.util.Date () dans ma collection, mais lorsque je demande des valeurs entre deux dates spécifiques, je finis par obtenir des valeurs en dehors de la plage. Voici mon code:

insérer

BasicDBObject object = new BasicDBObject();
...
object.put("dateAdded", new Java.util.Date());
collection.insert(object);

interroger

BasicDBObject query = new BasicDBObject();
query.put("dateAdded", new BasicDBObject("$gte", fromDate));
query.put("dateAdded", new BasicDBObject("$lte", toDate));
collection.find(query).sort(new BasicDBObject("dateAdded", -1));

quand je demande entre Wed Jul 27 16:54:49 EST 2011 et Wed Jul 27 16:54:49 EST 2011 (essentiellement fromDate = toDate), j'obtiens des objets avec des dates comme Tue Jul 26 09:43:37 EST 2011 ce qui ne devrait certainement pas être possible. Qu'est-ce que j'oublie ici?

35
Guillaume

Ce que vous faites, c'est interroger uniquement avec {$lte: toDate} perdre $gte opérateur dans l'écrasement de la clé. Ce que vous voulez c'est:

query.put("dateAdded", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get());
49
pingw33n

Si vous utilisez MongoTemplate de Spring-Data Mongodb, vous pouvez faire de même de la manière suivante: -

public List<Link> getLinksBetweenDate(Date startDate, Date endDate) {
            Query query = new Query().addCriteria(Criteria.where("updatedOn").gt(startDate).lte(endDate));
            return mongoTemplate.find(query, Link.class);
        }
3
Vaibhav

Utilisation de Mongo Client 3.0

DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
Bson filter = new Document("$gte", format.parse("2015-05-01T00:00:00Z")).append("$lt", format.parse("2015-05-02T00:00:00Z"));
long count = db.getCollection("colection").count(new Document("field",filter) );
3
Miguel Angel

Date de recherche avec un format spécifique, les étapes suivantes sont que cela fonctionne également dans mongo 3.0

SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy.MM.dd");

Convertissez d'abord votre date dans votre format spécifique, vous pouvez utiliser n'importe quel format et analyser votre date avec le format ci-dessus, puis passer la requête.

String date ="2014.01.02"; 
String data1 ="2014.01.10";
Date startDate = simpleDateFormat.parse(date);  
Date endDate = simpleDateFormat.parse(date1);
BasicDBObject query = new BasicDBObject("fieldName",
   new BasicDBObject("$gte",startDate).append("$lt",endDate ));

Donc, en fonction de vos besoins, vous pouvez rechercher la date en donnant un argument dans BasicDBobject.

3
Hemang Rami