Qual è il modo migliore per gestire i tasti compsiti quando si utilizza Salat con MongoDB?
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.
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.