MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Codec de pilote Mongodb scala pour les classes de traits et héritées

J'ai eu le même souci il y a quelques jours mais je n'ai rien trouvé dans la documentation concernant les sealed traits pour modéliser ADT dans MongoDB.

Au final, j'ai utilisé sealed class comme suggéré dans le officiel référentiel github du pilote scala .

Si vous voulez vraiment utiliser des traits (en raison de la définition des méthodes abstraites), vous pouvez faire quelque chose comme ceci :

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

Vous pouvez maintenant définir votre ADT pour A avec 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

Cette réponse ne résout pas directement la question, mais fournit une solution de contournement réalisable. Notez que ce code n'est qu'un exemple. Pour une implémentation plus complète, vous pouvez voir ce dépôt github .