1

SalatとMongoDBで複合キーを使用する方法についてこの投稿を読んだばかりです...そしてそれがどのように機能するかは多かれ少なかれ明らかです。@Keyそれでも、キーにすでに名前が付けられている場合でも、注釈が必須かどうか疑問に思っていidます。外部ライブラリからのいくつかのケースクラスをシリアル化しようとしていますが、それらを再定義したくありません。次の外部ケースクラスがあるとします。

case class UserId(id: String, mail: String)
case class User(id: UserId, name: String, surname: String)

Userこのような(つまり、@Key注釈なしで)オブジェクトをシリアル化することは可能でしょうか?

object UserDAO extends SalatDAO[User, UserId](...)

ありがとう。

4

1 に答える 1

1

MongoDBは、コレクション内のすべてのドキュメントに「_id」というIDフィールドがあることを想定しています。「_id」フィールドを指定しなかった場合、mongo-java-driverがフィールドを作成します。

したがって、実行する必要があるのは次のいずれかです。

  • フィールドに「id」ではなく「_id」という名前を付けます
  • がシリアル化されるときに、アノテーションを使用@Keyして「id」フィールドを「_id」に再マップしますUser
  • @Key「id」のグローバルキーの再マッピングを「_id」に追加して、その場で使用する必要がないようにします

外部モデルを扱う場合は、オプション3が最も効率的です。このWiki記事の「グローバルキーの再マッピング」のセクションを参照してください: https ://github.com/novus/salat/wiki/CustomContext

この再マッピングをUserDAO行うと、複合キーで正常に機能するはずです。

Userケースクラスでフィールドの名前が「id」であっても、MongoDBドキュメントでフィールドが呼び出されるため、クエリ参照する必要があることに注意してください。_id

また、複合キーを使用する場合は、複合キーのすべてのフィールドを、クエリする順序でカバーするカスタムインデックスを作成する必要があることを忘れないでください。Dexを使用して、MongoDBログを分析し、推奨事項を作成できます: https ://github.com/mongolab/dex

于 2013-02-18T14:27:41.190 に答える