2013-01-06 53 views
0

我與Morphia有一些問題。 有人可以幫我嗎?Morphia。如何從大數據存儲獲取信息的一部分

我在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個流派。例如其中之一:喜劇。 另外我有25萬喜劇。 現在我想按照流派=喜劇來做電影分頁。 我如何才能從所有喜劇中獲得20條記錄。 如果我使用@Embedded或@Reference註解,我仍然會一次獲得整個列表。這對於在控制器中使用它很重要。

回答

0

你應該改變你的數據模式來做這樣的查詢。您使用的架構具有循環依賴性,在您持有電影實體的流派實體中以及持有流派的電影中。根據流派持有所有電影也不容易查詢。如果我是你,我會使用這樣的模式。

@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網頁中,您可以找到關於如何根據不同場景設計架構的建議。

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

+0

非常感謝你。 – user1952756

+0

不客氣 – cubbuk

0

我對Mongo不太熟悉,但看起來您需要在此處實現自定義查詢。無論你做什麼,你都需要通過一個開始頁面,以及一個頁面大小(在你的情況下20)。

您可以通過在查詢上結合.offset(page_start)和.limit(page_size)在Morphia中進行分頁。因此,首先您將創建一個查詢來獲取屬於某種類型的電影,然後應用分頁。

貌似是用它辦理了倉庫春http://static.springsource.org/spring-data/data-mongodb/docs/1.0.0.RELEASE/reference/html/#repositories.special-parameters

你會使用可分頁實現通過傳呼數據,而不用擔心做偏移和限制要求自己。文檔中還有一個「Web分頁」的例子。

希望這會有所幫助!