用于特征和继承类的Mongodb scala驱动程序编解码器

时间:2017-07-17 20:32:15

标签: mongodb scala

使用以下mongo-driver。我想从MongoDB插入并获取结构(见下文)。

 trait A {
   def id: ObjectId
 }

 case class B(id: ObjectId) extends A

 case class C(id: ObjectId, name: String) extends A

我找到了使用密封类的解决方案,但我想使用特征。 我想找到一个使用Codecs或其他方法的解决方案。

2 个答案:

答案 0 :(得分:4)

我几天前也有同样的担忧,但在关于sealed traits的文档中没有找到任何关于在MongoDB中建模ADT的内容。

最后,我使用了official scala driver github repo中建议的sealed class

如果您真的想使用特征(由于抽象方法的定义),您可以这样做:

package example.model

import example.model.adt._
import org.mongodb.scala.bson.ObjectId
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}

trait MongoModel {
  def _id: ObjectId
}

object MongoModel {
  val codecRegistery = fromRegisteries(fromProviders(classOf[A]), DEFAULT_CODEC_REGISTRY)
}

现在,您可以使用sealed class定义A的ADT。

package example.model.adt

import example.model.MongoModel
import org.mongodb.scala.bson.ObjectId

sealed class A

final case class B(_id: ObjectId) extends A with MongoModel
final case class C(_id: ObjectId) extends A with MongoModel

这个答案没有直接解决问题,但提供了一个可行的解决方法。请注意,此代码只是一个示例。要获得更完整的实施,您可以看到this github repo

答案 1 :(得分:0)

从2.7版开始,mongodriver现在可以serialize sealed traits
就像序列化密封类一样。