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

特性类和继承类的Mongodb scala驱动程序编解码器,mongodb,scala,Mongodb,Scala,使用以下命令。我想从MongoDB中插入并获取如下结构 trait A { def id: ObjectId } case class B(id: ObjectId) extends A case class C(id: ObjectId, name: String) extends A 我找到了使用密封类的解决方案,但我想使用traits。 我想找到一个使用编解码器或其他东西的解决方案。几天前我也有同样的问题,但在文档中没有找到关于在MongoDB中建模ADT的密封特征的任

使用以下命令。我想从MongoDB中插入并获取如下结构

 trait A {
   def id: ObjectId
 }

 case class B(id: ObjectId) extends A

 case class C(id: ObjectId, name: String) extends A
我找到了使用密封类的解决方案,但我想使用traits。
我想找到一个使用编解码器或其他东西的解决方案。

几天前我也有同样的问题,但在文档中没有找到关于在MongoDB中建模ADT的密封特征的任何内容

最后,我按照中的建议使用了密封类

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

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)
}
现在,您可以使用密封类定义ADT


这个答案不能直接解决问题,但提供了一个可行的解决方法。请注意,此代码只是一个示例。有关更完整的实现,您可以看到

就在几天前,我也有同样的担忧,但在文档中没有找到关于在MongoDB中建模ADT的密封特征的任何内容

最后,我按照中的建议使用了密封类

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

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)
}
现在,您可以使用密封类定义ADT


这个答案不能直接解决问题,但提供了一个可行的解决方法。请注意,此代码只是一个示例。有关更完整的实现,您可以看到

自从2.7版发布以来,mongodriver现在就可以使用它了。
它的工作原理与序列化一个密封的类完全相同。

自2.7版以来,mongodriver现在能够密封特性。 它的工作原理与序列化密封的类完全相同