sql >> Base de Datos >  >> NoSQL >> MongoDB

Códec de controlador Mongodb Scala para rasgos y clases heredadas

Tuve la misma preocupación hace solo unos días, pero no encontré nada en la documentación con respecto a sealed traits para modelar ADT en MongoDB.

Al final, usé sealed class como se sugiere en el oficial repositorio de github del controlador scala .

Si realmente quiere usar rasgos (debido a la definición de métodos abstractos), puede hacer algo como esto:

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

Ahora puede tener su ADT para A definido con sealed class .

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

Esta respuesta no resuelve la pregunta directamente, pero proporciona una solución viable. Tenga en cuenta que este código es solo un ejemplo. Para una implementación más completa, puede ver este repositorio de github .