2011-05-06 17 views
14

Parece que no puedo encontrar nada para hacer una consulta de intervalo de fechas usando Mongoid/Rails. A continuación hay algunas consultas que he intentado (entre otras 100 más). Si devuelve algo, siempre ignora el 'end_date'. Ambas fechas son datetimes ...Pregunta de intervalo de fechas Mongoid

all(:conditions => {:created_at => start_date.to_datetime..end_date.to_datetime}) 

resultados en:

NoMethodError: undefined method `to_i' for Tue, 26 Apr 2011 00:00:00 +0000..Fri, 06 May 2011 00:00:00 +0000:Range 

otro ejemplo ...

where(:created_at => {'$gte' => start_date,'$lt' => end_date}) 

resultados de una consulta exitosa, pero la fecha final es ignorado. Los resultados vuelven correctamente después de la fecha de inicio, pero no están limitados por la fecha de finalización.

He estado trabajando en este problema durante varios días en vano. No hay mucha ayuda en línea, en los foros o IRC.

encantaría averiguar lo que estoy haciendo mal :)

Respuesta

11
+1

De hecho, esto se ha solucionado en Mongoid 2.0.2, pero no pude encontrar ninguna documentación con respecto a esta corrección de errores en ningún lado ... esto es un poco preocupante, tales errores podrían tener un gran impacto en mis aplicaciones ... no estoy seguro de qué hacer para evitar estos problemas si se rompe de nuevo en la versión futura :( – Alex

+1

Y parece que se rompió de nuevo. Mongoid 3.0 aquí, el mismo problema. – Michael

0

he utilizado la consola MongoDB para probar esto:

Ejecutado esto varias veces

db.con.save ({ creado: new Date()})

Entonces tuve

> db.con.find() 
{ "_id" : ObjectId("4dc3d380724a42d80d636b09"), "created" : ISODate("2011-05-06T10:54:56.809Z") } 
{ "_id" : ObjectId("4dc3d383724a42d80d636b0a"), "created" : ISODate("2011-05-06T10:54:59.699Z") } 
{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") } 
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") } 
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") } 
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") } 

Como fecha de división, elijo ISODate("2011-05-06T10:55:00Z") crear esto con d = new Date(2011,04,06,12,55,00) Las diferencias vienen desde que el mes comienza en cero y la hora está en la zona horaria. Ahora db.con.find({"created": {$gt:d}}) produce

{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") } 
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") } 
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") } 
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") } 

Así mongodb hace todo correcto. Cómo hacer eso en Ruby es algo que no sé.

+1

Gracias por la ayuda. Encontré un parche de Mongoid que funcionó. –

2

lo hice un poco de investigación y encontré el puesto Advanced Queries, en el que un usuario pregunta:

¿Hay una mejor manera de ordenar o consulta usando comparaciones de fecha y hora, que almacenar la fecha en Mongo un entero de segundos desde época? Este es actualmente la única forma en que trabaja para que yo haga comparaciones gte en Mongo para recuperar resultados.

respuesta de otro usuario a esto:

Utilice el tipo de fecha BSON nativa. Internamente, es un número entero de 64 bits de el número de milisegundos desde epoch.

Así que puede que desee acercarse a esto de manera diferente y convertir entre el número de milisegundos desde época para sus consultas de rango. De esta manera, estás haciendo un simple gte/lt en enteros.La sugerencia del usuario es relativamente nueva (publicada hace 3 meses), por lo que puede ser la forma más infalible de comparar fechas con Mongo en general (y, por lo tanto, Mongoid).

+0

Gracias por la ayuda. Encontré un parche de Mongoid que funcionó. –

Cuestiones relacionadas