将模型 Class 转换为 ReactiveMongo BSONDocument
Convert Model Class to ReactiveMongo BSONDocument
我有一个案例 class,它是我应用程序中的模型对象,如下所示:
case class MyModel(myTypeA: TypeA, str: String)
case class TypeA(intVal: Int, strVal: String)
我正在使用 MongoDB 和 ReactiveMongo 库来满足我的持久性需求。我想将此类型转换为 BSONDocument,以便我可以坚持这一点。我不想使用 play reactive mongo 模块,因为我将离开 Play 框架并在稍后阶段使用 Spray。我知道我应该在 BSON 和我的模型类型之间编写隐式转换。作为初学者,我做了以下事情:
implicit object MyModelBSONHandler extends BSONDocumentReader[MyModel] with BSONDocumentWriter[MyModel] {
def read(doc: BSONDocument) = {
MyModel(
str = doc.getAs[String]("str").get,
type = doc.getAs[TypeA]("myTypeA").get
)
}
def write(myModel: MyModel) = {
BSONDocument(
"str" -> myModel.str,
"myTypeA" -> myModel.myTypeA // Is this correct?
)
}
}
implicit object TypeABSONHandler extends BSONDocumentReader[TypeA] with BSONDocumentWriter[TypeA] {
def read(doc: BSONDocument) = {
TypeA(
doc.getAs[Int]("intVal").get,
doc.getAs[String]("strVal").get
)
}
def write(typeA: TypeA) = {
BSONDocument(
"intVal" -> typeA.intVal,
"strVal" -> typeA.strVal
)
}
}
可以看出,我不确定如何编写复杂的 BSON 类型?我还没有在我的代码库中试一试!
尝试通过 Macros
在对象伴侣中使用隐式处理程序值。这是更简单和优雅的方式来做到这一点。 There are class 文档中的一些复杂处理程序示例。
import reactivemongo.bson.Macros
case class MyModel(myTypeA: TypeA, str: String)
object MyModel{
implicit val handler = Macros.handler[MyModel]
}
case class TypeA(intVal: Int, strVal: String)
object TypeA{
implicit val handler = Macros.handler[TypeA]
}
class class Foo(n: Int, model: MyModel, tpe: TypeA, date: Long,
name: String/* and so on */ )
object Foo{
//and simple handler in one line of code
implicit val handler = Macros.handler[TypeA]
}
我在需要非常特定行为的地方使用自定义处理程序,其他情况都用宏覆盖。
我有一个案例 class,它是我应用程序中的模型对象,如下所示:
case class MyModel(myTypeA: TypeA, str: String)
case class TypeA(intVal: Int, strVal: String)
我正在使用 MongoDB 和 ReactiveMongo 库来满足我的持久性需求。我想将此类型转换为 BSONDocument,以便我可以坚持这一点。我不想使用 play reactive mongo 模块,因为我将离开 Play 框架并在稍后阶段使用 Spray。我知道我应该在 BSON 和我的模型类型之间编写隐式转换。作为初学者,我做了以下事情:
implicit object MyModelBSONHandler extends BSONDocumentReader[MyModel] with BSONDocumentWriter[MyModel] {
def read(doc: BSONDocument) = {
MyModel(
str = doc.getAs[String]("str").get,
type = doc.getAs[TypeA]("myTypeA").get
)
}
def write(myModel: MyModel) = {
BSONDocument(
"str" -> myModel.str,
"myTypeA" -> myModel.myTypeA // Is this correct?
)
}
}
implicit object TypeABSONHandler extends BSONDocumentReader[TypeA] with BSONDocumentWriter[TypeA] {
def read(doc: BSONDocument) = {
TypeA(
doc.getAs[Int]("intVal").get,
doc.getAs[String]("strVal").get
)
}
def write(typeA: TypeA) = {
BSONDocument(
"intVal" -> typeA.intVal,
"strVal" -> typeA.strVal
)
}
}
可以看出,我不确定如何编写复杂的 BSON 类型?我还没有在我的代码库中试一试!
尝试通过 Macros
在对象伴侣中使用隐式处理程序值。这是更简单和优雅的方式来做到这一点。 There are class 文档中的一些复杂处理程序示例。
import reactivemongo.bson.Macros
case class MyModel(myTypeA: TypeA, str: String)
object MyModel{
implicit val handler = Macros.handler[MyModel]
}
case class TypeA(intVal: Int, strVal: String)
object TypeA{
implicit val handler = Macros.handler[TypeA]
}
class class Foo(n: Int, model: MyModel, tpe: TypeA, date: Long,
name: String/* and so on */ )
object Foo{
//and simple handler in one line of code
implicit val handler = Macros.handler[TypeA]
}
我在需要非常特定行为的地方使用自定义处理程序,其他情况都用宏覆盖。