Фильтр поиска запроса Scala Mongo генерирует дату как длинную - PullRequest
0 голосов
/ 04 мая 2018

В Монго

"org.mongodb.scala"        %% "mongo-scala-driver"       % "2.1.0",

У меня есть это:

"_id" : ObjectId("5aeb1cc6f99d155c16478c96"), 
"userId" : "2c48bc64-76cd-41b0-88af-b8dfea667960", 
"eventAt" : ISODate("2018-05-03T14:29:25.964Z"), 
"activity" : { "userAltId" : null,
               ...
               "completedAt" : ISODate("2018-04-26T04:00:00Z"),
               ...
 }

В моей оболочке Mongo, когда я запускаю этот запрос

> db.getCollection('wwactivities').find({ userId: "2c48bc64-76cd-41b0-88af-b8dfea667960" , "activity.completedAt": {$lte: ISODate("2018-04-26T23:59:59Z")}, "activity.completedAt": {$gte: ISODate("2018-04-26T00:00:00Z")}})

Я получил правильный набор результатов:

{ "_id" : ObjectId("5aeb1cc6f99d155c16478c96"), "userId" : "2c48bc64-76cd-41b0-88af-b8dfea667960", "eventAt" : ISODate("2018-05-03T14:29:25.964Z"), "activity" : { 
"userAltId" : null, ...
"completedAt" : ISODate("2018-04-26T04:00:00Z"), ... 
} }

Когда я пытаюсь сгенерировать запрос в Scala-коде и использую фильтры Scala-Mongo, например:

val x = and( equal("userId", activityKey.userId), lt("activity.completedAt", atEndOfDay(toDate)), gt("activity.completedAt", atStartOfDay(fromDate)))

def atStartOfDay( date: Date ) = {
val cal = Calendar.getInstance()
cal.setTime(date)
cal.set(Calendar.HOUR_OF_DAY, 0)
cal.set(Calendar.MINUTE, 0)
cal.set(Calendar.SECOND, 0)
cal.set(Calendar.MILLISECOND, 0)
cal.getTime()

}

Или явно так:

val x = Document("activity.completedAt" -> Document("$gt" -> atStartOfDay(fromDate), "$lt" -> atEndOfDay(toDate)))
  println( s"q: ${document.toJson()}")

В обоих случаях println дает:

q: { "activity.completedAt" : { "$gt" : { "$date" : 1524715200000 }, "$lt" : { "$date" : 1524715200000 } } }

Когда я бегу

myCollection.find(x)

Результирующий набор пуст.

Итак, в двух словах, я пишу запрос с использованием ISODate в оболочке Mongo, и он работает и возвращает правильный документ. Однако когда я генерирую запрос в Scala, он представляет поля даты как int64, а набор результатов пуст.

Похоже, что сгенерированный документ из фильтра представляет java.util.Date как Long в запросе.

scala> new Date(1524715200000L)
res74: java.util.Date = Thu Apr 26 00:00:00 EDT 2018

scala> new Date(1524801599999L)

res75: java.util.Date = Thu Apr 26 23:59:59 EDT 2018

Есть идеи?

...