4

私はまだ手を取り合ってmongodb、どのように最良のエンティティをマッピングできるかを模索しています。たとえば、エンティティユーザーとエンティティアドレスを例に挙げます。one-to-many誰かがバックグラウンドから来ているときがあるかもしれませんjpa。ここmongoでは使用したくありませんdbref。したがって、アドレスはSetユーザーのコレクションに含まれます。

私が使用していたと仮定しspring-data-mongoます:

質問1:ユーザーとアドレスの両方に@Document注釈を付ける必要がありますか?それともユーザーだけですか?

質問2:ユーザーのアドレスを照会するための最良の方法は何ですか。そもそも可能ですか?今はUserbyusernameまたはを取得しIdてからユーザーのアドレスを取得するためにクエリを実行しているためです。直接クエリを実行できますsub-documentか?はいの場合、spring-data-mongoCriteriaQueryを使用してどのように実行されますか。

@Document
public class User{
    @Id
    private Long ID;
    private String username;
    private Set<Address> addresses = new HashSet<Address>();
    ...
} 

@Document
public class Address {
   @Id
   private Long ID;
   private String city;
   private String line1;
   ...

}
4

1 に答える 1

4

質問1:いいえ、@Document厳密には必要ありません。ドキュメントクラスのクラスパススキャンをアクティブにすると、アプリケーションの起動時にこれを利用するだけです。そうしないと、永続性メタデータのスキャンが最初の永続化操作で実行されます。次に、ドメインオブジェクトのプロパティをトラバースするため、Address検出されます。

質問2:UserMongoDBは現在、サブドキュメントを返すことを許可していないため、オブジェクトを完全に読み取る必要があります。したがって、ドキュメント全体をクエリする必要がありますが、オブジェクトまたはリポジトリ抽象化のアノテーションを使用してUser、フィールドに返されるフィールドを制限できます( ref docsを参照)。addressesfieldSpecQuery@Query

于 2012-11-26T13:31:41.320 に答える