MongodbでSalatを使用する際にCompsiteキーを扱う最良の方法は何ですか?
質問
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 - スタックオーバーフローよりも早くあなたの質問を見ることができます。
所属していません StackOverflow