Qual è il modo migliore per gestire i tasti compsiti quando si utilizza Salat con MongoDB?

StackOverflow https://stackoverflow.com/questions/8882797

  •  29-10-2019
  •  | 
  •  

Domanda

Sto usando Salat con MongoDB e sto cercando di convertire le chiavi naturali per evitare duplicati nel database. La classe di case che sto usando sembra un po 'come:

case class Foo(someRelatedId: String, email: String ...)

Vorrei aggiungere una chiave naturale che consiste in e -mail SomerelatedId e che MongoDB usi invece dell'oggetto predefinito. Dalla documentazione ho la sensazione che sia possibile, ma sto ancora tenendo in giro per una soluzione funzionante. Questo è in gran parte a causa della mia mancanza di competenza con Scala stessa, ne sono sicuro.

Aggiornamento: ora ho una soluzione funzionante, ma mi chiedo ancora se è il modo migliore per andare

case class Foo(someRelatedId: String, email: String, naturalKey: String)

object Foo {
  def apply((someRelatedId: String, email: String) {
    apply(someRelatedId, email, someRelatedId+email)
  }
}

E poi in pacchetto.scala mappa su a contesto di salat personalizzato:

implicit val ctx = new Context() {
  val name = Some("Custom Context")
}
ctx.registerGlobalKeyOverride(remapThis = "naturalKey", toThisInstead = "_id")

In questo modo evito di avere un campo _ID obbligatorio (insignificante) nelle mie classi di dominio, ma devo sovraccaricare applicare () sull'oggetto compagno, che sembra un po 'goffo.

È stato utile?

Soluzione

Sviluppatore del Main Salat qui.

Come suggerito da Milano, crea una classe di case per la chiave composita:

case class FooKey(someRelatedId: String, email: String)

case class Foo(@Key("_id") naturalKey: FooKey) {

  // use @Persist if you want these fields serialized verbatim to Mongo - see https://github.com/novus/salat/wiki/Annotations for details
  @Persist val email =  naturalKey.email
  @Persist val someRelatedId = naturalKey.someRelatedId

}

object FooDAO extends SalatDAO[Foo, FooKey](collection = /*  some Mongo coll */ )

Se ti oppondi a "_id" come nome di campo, è possibile utilizzare una sostituzione globale nel contesto per rimodellare "_id" a "naturalkey" o fornire una sovraccarico di ad hoc @key su ciascun oggetto.

Personalmente non mi piace dare al _id un nome diverso nei tuoi modelli poiché le tue query mongo devono utilizzare la chiave serializzata "_id" mentre tutta la logica aziendale deve usare il nome del campo di classe di case ("naturalkey" o altro), ma ymmv .

PS La nostra mailing list è a http://groups.google.com/group/scala-salat - Vedrò la tua domanda più velocemente lì di Stack Overflow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top