¿Cuál es la mejor manera de lidiar con las claves de CompSite cuando se usa Salat con MongoDB?

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

  •  29-10-2019
  •  | 
  •  

Pregunta

Estoy usando Salat con MongoDB y estoy tratando de convertirme en claves naturales para evitar duplicados en la base de datos. La clase de casos que estoy usando se parece algo así:

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

Me gustaría agregar una clave natural que consiste en SomerelatedID+Correo electrónico y hacer que MongoDB use eso en lugar del ObjectId predeterminado. Por la documentación tengo la sensación de que es posible, pero todavía estoy a tientas para una solución de trabajo. Esto se debe en gran parte a mi falta de competencia con Scala en sí, estoy seguro.

ACTUALIZACIÓN: Tengo una solución de funcionamiento ahora, pero todavía me pregunto si es la mejor manera de hacerlo

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

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

Y luego en paquete.scala, mapeo a un Contexto de Salat personalizado:

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

De esta manera, evito tener un campo _id obligatorio (sin sentido) en mis clases de dominio, pero tengo que sobrecargar () en el objeto complementario, lo que parece un poco torpe.

¿Fue útil?

Solución

Desarrollador principal de Salat aquí.

Como sugirió Milán, cree una clase de casos para su clave compuesta:

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 */ )

Si se opone a "_id" como un nombre de campo, puede usar una anulación global en el contexto para reasignar "_id" a "NaturalKey" o suministrar anulaciones ad hoc @Key en cada objeto.

No me gusta personalmente darle al _id un nombre diferente en sus modelos, ya que sus consultas Mongo deben usar la clave serializada "_ID" mientras toda su lógica comercial debe usar el nombre del campo de la clase de caso ("KeyKey" o lo que sea), pero YMMV .

PD: nuestra lista de correo está en http://groups.google.com/group/scala-salat - Veré tu pregunta más rápido allí que el desbordamiento de la pila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top