ReactiveMongo & Play: как сравнить два экземпляра DateTime

Я использую Play-ReactiveMongo для взаимодействия с MongoDB... и мне интересно, как сравнить два даты, учитывая, что я не использую BSON в своем приложении. Позвольте мне привести вам пример:

def isTokenExpired(tokenId: String): Future[Boolean] = {

  var query = collection.genericQueryBuilder.query(
    Json.obj(
      "_id" -> Json.obj("$oid" -> tokenId),
      "expirationTime" -> Json.obj("$lte" -> DateTime.now(DateTimeZone.UTC))
    )
  ).options(QueryOpts(skipN = 0))

  query.cursor[JsValue].collect[Vector](1).map {
    case Some(_) => true
    case _ => false
  }
}

isTokenExpired работает не так, как ожидалось, поскольку expirationTime считается String. У меня есть неявный Writes, который сериализует DateTime как "yyyy-MM-ddTHH:mm:ss.SSSZ"... и это правильно, так как мне нужен удобочитаемый JSON.

Тем не менее, как мне получить документ из коллекции, у которого DateTime меньше, чем у другого DateTime? Следующее не работает:

Json.obj(
  "_id" -> Json.obj("$oid" -> tokenId),
  "expirationTime" -> Json.obj("$lte" -> Json.obj("$date" -> DateTime.now(DateTimeZone.UTC).getMillis))
)

Спасибо.


person j3d    schedule 19.08.2014    source источник


Ответы (1)


У меня есть неявная запись, которая сериализует DateTime как "yyyy-MM-ddTHH:mm:ss.SSSZ"... и это правильно, так как мне нужен удобочитаемый JSON.

Если вы храните DateTime в виде строки в MongoDB, тогда $lte не будет сравнивать даты.

Вы должны сохранить DateTime как дату в MongoDB (с $date), чтобы вы могли использовать свой второй запрос (с $lte и $date).

Я хочу удобочитаемый JSON

Зачем вам человекочитаемый JSON? Я не вижу причин против типа данных даты (если вам нужен удобочитаемый JSON в вашем API, тогда преобразуйте туда поле даты). Даты MongoDB читаются. Вывод в оболочке MongoDB:

PRIMARY> db.mycollection.findOne()
{
     "creation" : ISODate("2014-01-16T14:45:27.441Z")
}
person planetenkiller    schedule 20.08.2014
comment
Когда я говорю человекочитаемый JSON, я имею в виду JSON, возвращаемый моим Scala API, а не JSON, отображаемый консолью mongo - возможно, я недостаточно ясно выразился ;-) - person j3d; 20.08.2014