MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb-Scala-Treiber-Codec für Eigenschaften und geerbte Klassen

Ich hatte vor ein paar Tagen die gleichen Bedenken, konnte aber in der Dokumentation nichts zu sealed traits finden zum Modellieren von ADT in MongoDB.

Am Ende habe ich sealed class verwendet wie im offiziell vorgeschlagen Scala-Treiber-GitHub-Repo .

Wenn Sie wirklich Eigenschaften verwenden möchten (aufgrund der Definition abstrakter Methoden), können Sie Folgendes tun:

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

Jetzt können Sie Ihr ADT für A mit sealed class definieren lassen .

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

Diese Antwort löst die Frage nicht direkt, bietet jedoch eine praktikable Problemumgehung. Beachten Sie, dass dieser Code nur ein Beispiel ist. Eine vollständigere Implementierung finden Sie in diesem Github-Repo .