2010-11-27 6 views
5

Je suis perplexe sur casbah trouver. J'essaye de retirer tous les documents d'un MongoDB entre date1 et date2. Voici un exemple ensemble de mongo docs:trouver des entrées mongodb par joda DateTime gamme 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"} 

Alors, disons que je veux retirer les documents de 27 septembre Comment dois-je procéder?

Dans la documentation de casbah, il semble que je pourrais construire un constructeur comme ceci:

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) 

Dans mon IDE (Netbeans), cela ne compile pas parce que « $ est gte pas membre de java.lang .Chaîne". J'ai eu des résultats similaires avec les autres façons documentées de construire mon filtre.

Je suppose que le prochain problème que je voudrais, c'est qu'il ne sait pas comment comparer les dates, car ils sont stockés en tant que joda DateTimes, donc si quelqu'un a de l'expérience avec ces problèmes, j'apprécierais beaucoup de conseils.

Merci, John

SUIVI:

J'ai une solution partielle, mais seulement parce que j'utilisais les millisecondes comme le _id. Voici un code qui fonctionne pour ce cas:

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) 

Je suis toujours intéressé par l'apprentissage d'une solution qui fonctionne sur DateTime au lieu du long Millis ...

Répondre

1

opentime est stocké sous forme de chaîne sur le côté Mongo. Votre fonction $ gte ne fonctionnera pas. La comparaison de chaînes de caractères ne fonctionnera pas. Pour que cela fonctionne, vous devrez utiliser une clause $ where et une fonction qui effectue correctement la comparaison. Donc, vous devrez écrire une fonction javascript qui interprète correctement l'heure JODA. Vous devrez alors inclure cette fonction avec votre appel DB ou vous devrez l'enregistrer côté serveur et procéder à partir de là.

Voici quelques détails sur le where clause. Voici quelques détails sur server-side code execution.

+0

Merci, c'est utile. – jxstanford

+0

Si la disposition des données était ouverte pour les changements, @jxstanford pourrait également stocker les champs 'opentime' et' closetime' comme dates, mais cela perdrait leur caractère local (par exemple, les stocker en UTC). MongoDB devrait faciliter le travail avec les heures locales. – akauppi