6

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

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

someRelatedId + emailで構成される自然キーを追加し、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で、カスタムのsalatコンテキストにマップします。

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

このようにして、ドメインクラスに必須の(意味のない)_idフィールドを持たないようにしますが、コンパニオンオブジェクトにapply()をオーバーロードする必要がありますが、これは少し不格好なようです。

4

1 に答える 1

5

主な Salat 開発者はこちら。

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

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にあります。スタック オーバーフローよりも早く質問を確認できます。

于 2012-01-17T16:24:41.480 に答える