MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Codec de driver scala Mongodb para classes de traço e herdadas


Eu tive a mesma preocupação apenas alguns dias atrás, mas não encontrei nada na documentação sobre sealed traits para modelar ADT no MongoDB.

No final, usei sealed class conforme sugerido no oficial repositório do github do driver scala .

Se você realmente deseja usar traits (devido à definição de métodos abstratos), pode fazer algo assim:
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)
}

Agora você pode ter seu ADT para A definido com 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 resposta não resolve a questão diretamente, mas fornece uma solução viável. Observe que este código é apenas um exemplo. Para uma implementação mais completa, você pode ver este repositório do github .