2010-11-27 9 views
5

Estoy perplejo en encontrar casbah. Estoy intentando retirar todos los documentos de un MongoDB entre date1 y date2. Aquí está un ejemplo de documentos mongo:buscando entradas mongodb por joda Rango DateTime scala/casbah

{ "_id" : NumberLong("1285248838000"), "openTime" : "Thu Sep 23 2010 06:33:58 GMT-0700 (PDT)", "closeTime" : "Thu Sep 23 2010 06:36:15 GMT-0700 (PDT)", "timeInTrade" : "00:02:17", "direction" : "Long", "size" : 1, "outcome" : "Loss" } 
{ "_id" : NumberLong("1285595711000"), "openTime" : "Mon Sep 27 2010 06:55:11 GMT-0700 (PDT)", "closeTime" : "Mon Sep 27 2010 06:57:37 GMT-0700 (PDT)", "timeInTrade" : "00:02:26", "direction" : "Short", "size" : 1, "outcome" : "Win"} 
{ "_id" : NumberLong("1285594773000"), "openTime" : "Mon Sep 27 2010 06:39:33 GMT-0700 (PDT)", "closeTime" : "Mon Sep 27 2010 06:41:47 GMT-0700 (PDT)", "timeInTrade" : "00:02:14", "direction" : "Short", "size" : 1, "outcome" : "Win" } 
{ "_id" : NumberLong("1286289026000"), "openTime" : "Tue Oct 05 2010 07:30:26 GMT-0700 (PDT)", "closeTime" : "Tue Oct 05 2010 07:36:23 GMT-0700 (PDT)", "timeInTrade" : "00:05:57", "direction" : "Short", "size" : 2, "outcome" : "Loss"} 

Por lo tanto, digamos que quiero tirar de los documentos de SEP 27. ¿Cómo voy a ir haciendo eso?

En la documentación casbah, parece como si pudiera construir un constructor de la siguiente manera:

val dt = new DateTime("2010-09-27T00:00:00.000-08:00") 
val bldr = MongoDBObject.newBuilder 
bldr += "openTime" $gte dt $lt dt.plusDays(1) 
val result = coll.find(bldr.result) 

En mi IDE (Netbeans), esto no va a compilar porque "$ gte no es miembro de java.lang .Cuerda". Obtuve resultados similares con las otras formas documentadas de construir mi filtro.

Sospecho que el siguiente problema que tendría es que no sabe cómo comparar las fechas porque están almacenadas como joda DateTimes, por lo que si alguien tiene experiencia con estos problemas, agradecería mucho alguna orientación.

Gracias, John

SEGUIMIENTO:

Tengo una solución parcial, pero sólo porque yo estaba usando los milisegundos como _ID. Aquí hay un código que funcione para ese caso:

val begin = dt.getMillis 
val end = dt.plusDays(1).getMillis 
val json = "{ '_id' : { '$gte' : " + begin + " , '$lt' : " + end + "}}" 
val dbObject = JSON.parse(json).asInstanceOf[DBObject]; 
for (x <- coll.find(dbObject)) println(x) 

Todavía estoy interesado en aprender acerca de una solución que funciona en DateTime en lugar del largo millis ...

Respuesta

1

opentime se almacena como una cadena de el lado de Mongo. Su función $ gte no funcionará. La comparación de cadenas b/c no funcionará.

Para que esto funcione, tendrá que usar una cláusula $ where y una función que realice la comparación correctamente. Por lo tanto, básicamente tendrá que escribir una función de JavaScript que interprete correctamente la hora de JODA. Luego tendrá que incluir esa función con su llamada al DB o deberá almacenarla en el servidor y continuar desde allí.

Aquí hay algunos detalles sobre el where clause. Aquí hay algunos detalles sobre server-side code execution.

+0

Gracias, eso es útil. – jxstanford

+0

Si el diseño de datos estuviera abierto para cambios, @jxstanford también podría almacenar los campos 'tiempo de operación' y' tiempo de cierre 'como fechas, pero eso perdería su tiempo local (por ejemplo, almacenarlos como UTC). MongoDB debería facilitar el trabajo con las horas locales. – akauppi

Cuestiones relacionadas