0

モルヒネに問題があります。誰かが私を助けてもらえますか?

私は映画や有名人についてSpring+MongoDBでウェブプロジェクトを書いています。私はエンティティクラスを持っていますジャンル:

@Entity(value="genres")
public class Genre implements IGenre {

    @Id
    @Indexed
    private ObjectId id;

    @Indexed
    private String name;

    private String description;

    private long quantity;

    private Set <IMovie> movies;

    //getters and setters

}

そしてエンティティクラスの映画:

@Entity(value="movies")
public class Movie implements IMovie {

    @Id
    @Indexed
    private ObjectId id;

    @Indexed
    private String originalTitle;

    private String year;

    private Set <IGenre> genres;

    // getters and setters

}

私は30のジャンルを持っています。そして、例えばそれらの1つ:コメディ。また、私は25万人のコメディーを持っています。そして今、ジャンル=コメディで映画のページ付けをしたいです。すべてのコメディから20レコードしか入手できない方法。@Embeddedまたは@Referenceアノテーションを使用しても、リスト全体を一度に取得できます。そして、それはコントローラーで使用するには大きすぎます。

4

2 に答える 2

0

私はMongoにあまり詳しくありませんが、ここでカスタムクエリを実装する必要があるようです。何をするにしても、ページの開始とページサイズ(この場合は20)を渡す必要があります。

クエリで.offset(page_start)と.limit(page_size)を組み合わせることにより、Morphiaでページネーションを行うことができます。したがって、最初にクエリを作成して特定のジャンルに属する映画を取得し、次にページネーションを適用します。

Springhttp://static.springsource.org/spring-data/data-mongodb/docs/1.0.0.RELEASE/reference/html/#repositories.special-parametersのリポジトリを使用して処理されているようです

Pageable実装を使用して、オフセット呼び出しと制限呼び出しを自分で行うことを心配せずに、ページングデータを渡します。ドキュメントのさらに「Webページ付け」の例があります。

お役に立てれば!

于 2013-01-06T13:04:10.260 に答える
0

このようなクエリを実行するには、データスキーマを変更する必要があります。使用するスキーマには循環依存関係があり、GenreエンティティではMoviesエンティティを保持し、MoviesではGenreを保持します。また、ジャンル別にすべての映画を保持することは、クエリするのは簡単ではありません。もし私があなたなら、そのようなスキーマを使うでしょう。

@Entity(noClassnameStored = true) // you wouldn't have any problem when you change the class name or package of your class if you don't store the classname through this annotation
    public class Movie implements IMovie {

        @Id
        @Indexed
        private ObjectId id;

        @Indexed
        private String originalTitle;

        private String year;

        private Set <String> genres; // unique identifier of the genres instead of embedding the whole genre entity

        // getters and setters

    }

したがって、このようなスキーマを使用すると、ジャンルフィールドから単純な$ inクエリを記述して、特定のジャンルの映画を取得できます。ケースのクエリ例:

datastore.find(Movie.class).field("genres").in(Lists.newArrayList("comedy")).limit(20).asList;

以下のmongoのWebページでは、さまざまなシナリオに従ってスキーマを設計する方法についての提案を見つけることができます。

http://docs.mongodb.org/manual/core/data-modeling/#data-modeling-patterns-and-examples

于 2013-01-07T08:26:13.540 に答える