2011-07-27 106 views
34

almacené un valor como java.util.Date() en mi colección, pero cuando consulto para obtener valores entre dos fechas específicas, termino obteniendo valores fuera del rango. Aquí está mi código:consulta de Java/MongoDB por fecha

para insertar

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

para consultar

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)); 

cuando consulto entre Wed Jul 27 16:54:49 EST 2011 y Wed Jul 27 16:54:49 EST 2011 (básicamente fromDate = TODATE), consigo objetos con fechas como Tue Jul 26 09:43:37 EST 2011, que sin duda debe no ser posible ¿Que me estoy perdiendo aqui?

Respuesta

47

Lo que está haciendo es consultar solo con {$lte: toDate} perdiendo $gte operador en la sobrescritura de la clave. Lo que queremos es:

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

Excelente consejo! Entonces, básicamente, cada vez que quiero consultar en el mismo campo con diferentes criterios, tengo que usar el constructor, ¿verdad? ¡bueno saber! ¿Dónde encontraste esto? ¿Hay alguna documentación de la que no tenga conocimiento? (¡Ya que el tutorial oficial de Java de mongodb es bastante pobre!) – Guillaume

+1

@Guillaume No exactamente. También puedes crear y poblar 'BasicDBObject', el constructor es solo un ayudante que permite hacerlo dentro de un solo satement. El problema es que 'DBObject' (como todos los' Map's en Java) puede contener solo claves únicas. Y pierde el valor anterior al poner uno nuevo con la misma clave. También el tutorial oficial tiene un ejemplo sobre cómo usar múltiples operadores en el mismo campo: http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-GettingASetofDocumentsWithaQuery – pingw33n

+3

Sorprendentemente difícil encontrar la respuesta a esa pregunta. –

1

Si está utilizando MongoTemplate de Primavera-datos MongoDB, puede hacer lo mismo en el siguiente manera: -

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

Usando cliente 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é devuelve el recuento largo? ¿Qué está contenido dentro de esta variable? ¿Cómo extraes las entradas de la base de datos de esta variable? – user3388925

2

Fecha de búsqueda con formato específico Los siguientes pasos son que esto también funciona en mongo 3.0

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

Primero convierta su fecha en su formato específico, puede usar cualquier formato y analizar su fecha con el formato anterior y luego pasar la consulta.

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)); 

lo tanto la base de sus necesidades usted puede buscar la fecha, dando argumento a BasicDBobject.

Cuestiones relacionadas