Каков наилучший способ иметь дело с составными ключами при использовании Salat с MongoDB? - PullRequest
6 голосов
/ 16 января 2012

Я использую Salat с MongoDB и пытаюсь конвертировать в натуральные ключи, чтобы избежать дубликатов в базе данных. Класс case, который я использую, выглядит примерно так:

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

Я хотел бы добавить естественный ключ, который состоит из электронной почты someRelatedId +, и MongoDB использует его вместо стандартного ObjectId. Из документации я чувствую, что это возможно, но я все еще пытаюсь найти рабочее решение. Я уверен, что это во многом из-за отсутствия у меня опыта работы с самой Scala.

Обновление: сейчас у меня есть работающее решение, но я все еще задаюсь вопросом, лучший ли это путь?

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

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

А затем в package.scala я сопоставляю пользовательский контекст :

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

Таким образом, я избегаю обязательного (бессмысленного) поля _id в моих классах домена, но мне приходится перегружать apply () на объекте-компаньоне, что кажется немного неуклюжим.

1 Ответ

5 голосов
/ 17 января 2012

Основной разработчик Salat здесь.

Как и предложил Милан, создайте класс case для вашего составного ключа:

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

Если вы возражаете против "_id" в качестве имени поля, вы можетеиспользуйте глобальное переопределение в контексте, чтобы переназначить «_id» на «naturalKey» или предоставить специальные переопределения @Key для каждого объекта.

Мне лично не нравится давать _id другое имя в ваших моделях, так как тогда ваши запросы Mongo должны использовать сериализованный ключ "_id", в то время как вся ваша бизнес-логика должна использовать имя поля класса случая ("naturalKey")или что угодно), но YMMV.

PS Наш список рассылки: http://groups.google.com/group/scala-salat - я увижу ваш вопрос быстрее, чем переполнение стека.

...