通过joda找到mongodb条目DateTime范围scala/casbah

jxs*_*ord 5 scala jodatime mongodb

我被casbah发现难倒了.我试图在date1和date2之间从MongoDB中撤回所有文档.这是一组mongo文档的示例:

{ "_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"}
Run Code Online (Sandbox Code Playgroud)

所以,让我们说我想从9月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)
Run Code Online (Sandbox Code Playgroud)

在我的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)
Run Code Online (Sandbox Code Playgroud)

我仍然有兴趣了解一个适用于DateTime而不是Long millis的解决方案......

Gat*_* VP 1

opentime在 Mongo 端存储为字符串。你的 $gte 函数不起作用,b/c 字符串比较不起作用。

要实现此目的,您必须使用 $where 子句和正确执行比较的函数。因此,您基本上必须编写一个 javascript 函数来正确解释 JODA 时间。然后,您必须将该函数包含在数据库调用中,否则您必须将其存储在服务器端并从那里继续。

以下是有关where 子句的一些详细信息。以下是有关服务器端代码执行的一些详细信息。