【问题标题】:Convert Model Class to ReactiveMongo BSONDocument将模型类转换为 ReactiveMongo BSONDocument
【发布时间】:2015-10-21 14:39:26
【问题描述】:

我有一个案例类,它是我的应用程序中的模型对象,如下所示:

case class MyModel(myTypeA: TypeA, str: String)
case class TypeA(intVal: Int, strVal: String)

我正在使用 MongoDB 和 ReactiveMongo 库来满足我的持久性需求。我想将此类型转换为 BSONDocument 以便我可以保留它。我不想使用 play 响应式 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 类型?我还没有在我的代码库中尝试一下!

【问题讨论】:

    标签: json mongodb reactivemongo


    【解决方案1】:

    尝试通过Macros 在对象伴侣中使用隐式处理程序值。它更简单优雅的方式来做到这一点。 There are 类文档中的一些复杂处理程序示例。

    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]
    }
    

    我在需要非常具体的行为时使用自定义处理程序,其他情况完全由宏覆盖。

    【讨论】:

    • 酷!今晚我要试试这个!感谢您的帖子!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多