2011-07-27 6 views
34

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:Requête Java/MongoDB par date

pour insérer

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

pour 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 fais une recherche entre Wed Jul 27 16:54:49 EST 2011 et Wed Jul 27 16:54:49 EST 2011 (essentiellement fromDate = toDate), je reçois des objets avec des dates comme Tue Jul 26 09:43:37 EST 2011 qui devrait certainement pas possible. Qu'est-ce que j'oublie ici?

Répondre

47

Ce que vous faites interroge seulement avec {$lte: toDate} perdant $gte opérateur dans l'écrasement de clé. Ce que vous voulez est:

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

Excellent conseil! Donc, fondamentalement, chaque fois que je veux interroger sur le même champ avec des critères différents, je dois utiliser le constructeur non? bon à savoir! Où as tu trouvé ça? Y a-t-il de la documentation dont je ne suis pas au courant? (puisque le tutoriel Java officiel mongodb est assez pauvre!) – Guillaume

+1

@Guillaume Pas exactement. Vous pouvez aussi créer et peupler 'BasicDBObject', le constructeur est juste un assistant qui permet de le faire à l'intérieur d'un seul état. Le problème est que 'DBObject' (comme tous' Map's en Java) ne peut contenir que des clés uniques. Et vous perdez la valeur précédente en mettant un nouveau avec la même clé. Aussi tutoriel officiel a un exemple sur la façon d'utiliser plusieurs opérateurs sur le même champ: http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-GettingASetofDocumentsWithaQuery – pingw33n

+3

Étonnamment difficile de trouver la réponse à cette question. –

1

Si vous utilisez MongoTemplate de Spring-Data MongoDB, vous pouvez faire la même chose 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

utilisant le client mongo 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)); 
+0

Qu'est-ce que le compte à long terme revient? Qu'est-ce qui est contenu dans cette variable? Comment extrayez-vous les entrées de base de données de cette variable? – user3388925

2

Date de la 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"); 

Commencez par convertir votre date dans votre format spécifique, vous pouvez utiliser n'importe quel format et analyser votre date au format ci-dessus, puis passer en 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 la base de vos besoins, vous pouvez rechercher ce jour en donnant argument BasicDBobject.