поиск записей mongodb от joda DateTime диапазон scala / casbah - PullRequest
5 голосов
/ 27 ноября 2010

Я нахожусь в тупике при поиске касбы.Я пытаюсь получить все документы из MongoDB между date1 и date2.Вот пример набора документов монго:

{ "_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"}

Итак, допустим, я хочу отозвать документы с 27 сентября. Как бы я поступил так?

В документации по casbah похоже, что я мог бы построить конструктор следующим образом:

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)

В моей IDE (Netbeans) это не скомпилируется, потому что "$ 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)

Мне все еще интересно узнать о решении, которое работает на DateTime вместо Long millis ...

1 Ответ

1 голос
/ 27 ноября 2010

opentime хранится в виде строки на стороне Монго.Ваша функция $ gte не будет работать, b / c сравнение строк не будет работать.

Чтобы сделать это, вам нужно использовать выражение $ where и функцию, которая выполняет сравнение правильно.Таким образом, вам придется написать функцию javascript, которая правильно интерпретирует время JODA.Затем вам нужно будет включить эту функцию в ваш вызов БД, или вам придется сохранить ее на стороне сервера и продолжить оттуда.

Вот некоторые подробности в предложении where Вот некоторые подробности о выполнении серверного кода .

...