2010-11-27 12 views
5

私はcasbah findで困惑しています。私はdate1とdate2の間でMongoDBからすべてのドキュメントを取り戻そうとしています。ここではMongoのドキュメントの設定例を示しますjodaによってmongodbのエントリが見つかりましたDateTime range 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"} 

それでは、私はそれをやって行くだろうどのように9月27から文書を引き戻すしたいとしましょうか?私のIDE(Netbeansの)で

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) 

$ GTEはjava.langでのメンバーではない」ので、これはコンパイルされません:カスバのドキュメントで

、それは私がこのようなビルダーを構築することができようになります。 .String "。私は、フィルタを構築するための他の文書化された方法と同様の結果を得ました。

次の問題は、日付を比較する方法がわからないことです.Joda DateTimesとして保存されているので、誰かがこれらの問題を経験している場合、私はいくつかの指針を高く評価します。

おかげで、 ジョン

フォローアップ:

私は部分的な解決策を持っているが、私は_idとしてミリ秒を使用していたという理由だけで。ここではそのような場合のために働くいくつかのコードは次のとおりです。...私はまだ日時の代わりに、ロングミリに機能するソリューションについて学ぶことに興味がある

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) 

答えて

1

opentimeは、上の文字列として保存されていますモンゴン側。あなたの$ gte関数は動作しませんb/c文字列の比較は機能しません。

これを行うには、$ where句と比較を正しく実行する関数を使用する必要があります。したがって、基本的にJODAの時刻を正しく解釈するjavascript関数を記述する必要があります。 DBコールでその関数をインクルードする必要があります。そうしなければ、サーバー側に格納してそこから処理する必要があります。

ここにはwhere clauseに関する詳細がいくつかあります。以下はserver-side code executionの詳細です。

+0

ありがとうございました。 – jxstanford

+0

データレイアウトが変更のために開いている場合、@ jxstanfordは 'opentime'と' closetime'フィールドを日付として保存することもできますが、ローカルタイムを失うことになります。 MongoDBは現地時間での作業を容易にするべ​​きです。 – akauppi

関連する問題