使用以下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或其他方法的解决方案。
答案 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
。
就像序列化密封类一样。