【问题标题】:ReactiveMongo & Play: How to compare two DateTime instancesReactiveMongo & Play:如何比较两个 DateTime 实例
【发布时间】:2014-08-19 11:20:44
【问题描述】:

我使用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 - 我有一个隐含的 WritesDateTime 序列化为 "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))
)

谢谢。

【问题讨论】:

    标签: json mongodb scala playframework reactivemongo


    【解决方案1】:

    我有一个隐式写入,它将 DateTime 序列化为“yyyy-MM-ddTHH:mm:ss.SSSZ”...这是正确的,因为我想要一个人类可读的 JSON。

    如果您将 DateTime 作为字符串存储在 MongoDB 中,则 $lte 不会比较日期。

    您应该将 DateTime 作为日期存储在 MongoDB 中(使用 $date),以便您可以使用第二个查询(使用 $lte$date 的查询)。

    我想要一个人类可读的 JSON

    为什么需要人类可读的 JSON?我看不出有任何反对日期数据类型的理由(如果您的 API 中需要人类可读的 JSON,请在此处转换您的日期字段)。 MongoDB 日期是可读的。 MongoDB shell 中的输出:

    PRIMARY> db.mycollection.findOne()
    {
         "creation" : ISODate("2014-01-16T14:45:27.441Z")
    }
    

    【讨论】:

    • 当我说“人类可读的 JSON”时,我的意思是我的 Scala API 返回的 JSON,而不是 mongo 控制台呈现的 JSON - 也许我不够清楚 ;-)
    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多