MongodbでSalatを使用する際にCompsiteキーを扱う最良の方法は何ですか?

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

  •  29-10-2019
  •  | 
  •  

質問

MongodbでSalatを使用しています。データベース内の重複を避けるために、自然なキーに変換しようとしています。私が使用しているケースクラスは、ある程度似ています。

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

SomerelatedID+メールで構成される自然なキーを追加し、デフォルトのObjectIDの代わりにMongoDBを使用してもらいたいと思います。ドキュメントから、私はそれが可能であると感じていますが、私はまだ実用的な解決策を模索しています。これは、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で私はaにマップします カスタムサラットコンテキスト:

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

これにより、ドメインクラスに必須の(意味のない)_IDフィールドがあることを避けますが、コンパニオンオブジェクトにApply()を過負荷する必要があります。

役に立ちましたか?

解決

メインサラット開発者はこちら。

ミラノが提案したように、複合キーのケースクラスを作成します。

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オーバーライドを供給できます。

Mongoクエリがシリアル化キー「_ID」を使用する必要があるため、モデルに別の名前を付けるのは個人的には好きではありません。 。

PSメーリングリストはにあります http://groups.google.com/group/scala-salat - スタックオーバーフローよりも早くあなたの質問を見ることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top