В Монго
"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
Есть идеи?