我已经开始使用带有 reactivemongo 0.20.11 的 play-json/play-json-compat 库。
因此,我可以在导入“reactivemongo.play.json._”包时使用 JSON Play 读/写,然后轻松地从 JSONCollection 而不是 BSONCollection 获取数据。在大多数情况下,这很有效,但对于 Long 字段,它不会:(
例如:
case class TestClass(name: String, age: Long)
object TestClass {
implicit val reads = Json.reads[TestClass]
}
如果我尝试使用以下函数进行查询:
def getData: Map[String, TestClass] = {
val res = collection.find(emptyDoc)
.cursor[TestClass]()
.collect[List](-1, Cursor.ContOnError[List[TestClass]] { case (_, t) =>
failureLogger.error(s"Failed deserializing TestClass from Mongo", t)
})
.map { items =>
items map { item =>
item.name -> item.age
} toMap
}
Await.result(res, 10 seconds)
}
然后我收到以下错误:
play.api.libs.json.JsResultException: JsResultException(errors:List((/age,List(ValidationError(List(error.expected.jsnumber),WrappedArray())))))
我调试了文档的读取,注意到当它首先将 BSON 转换为 JsObject 时,长字段如下:
"age": {"$long": 1526389200000}
我找到了一种方法来完成这项工作,但我真的不喜欢它:
case class MyBSONLong(`$long`: Long)
object MyBSONLong {
implicit val longReads = Json.reads[MyBSONLong]
}
case class TestClass(name: String, age: Long)
object TestClass {
implicit val reads = (
(__ \ "name").read[String] and
(__ \ "age").read[MyBSONLong].map(_.`$long`)
) (apply _)
}
所以这行得通,但这是一个非常丑陋的解决方案。有一个更好的方法吗?
提前致谢 :)