ReactiveMongo&播放:如何比较两个DateTime实例

时间:2014-08-19 11:20:44

标签: json mongodb scala playframework reactivemongo

我使用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序列化为{ {1}} ...这是正确的,因为我想要一个人类可读的JSON。

那就是说,如何从"yyyy-MM-ddTHH:mm:ss.SSSZ"小于另一个DateTime的集合中获取文档?以下似乎不起作用:

DateTime

感谢。

1 个答案:

答案 0 :(得分:2)

  

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

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

您应该将DateTime与日期存储在MongoDB中(使用$date),这样您就可以使用第二个查询($lte$date)。< / p>

  

我想要一个人类可读的JSON

为什么你需要人类可读的JSON?我没有看到任何反对date数据类型的原因(如果你的API中需要人类可读的JSON,那么在那里转换你的日期字段)。 MongoDB日期是可读的。 MongoDB shell中的输出:

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