MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Codec driver scala Mongodb per tratti e classi ereditate

Ho avuto la stessa preoccupazione solo pochi giorni fa, ma non ho trovato nulla nella documentazione relativa a sealed traits per la modellazione di ADT in MongoDB.

Alla fine, ho usato sealed class come suggerito nel ufficiale scala driver github repository .

Se vuoi davvero usare i tratti (a causa della definizione di metodi astratti) puoi fare qualcosa del genere:

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

Ora puoi definire il tuo ADT per A 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

Questa risposta non risolve direttamente la domanda ma fornisce una soluzione fattibile. Nota che questo codice è solo un esempio. Per un'implementazione più completa, puoi vedere questo repository github .