0

我对 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 种类型。例如其中之一:喜剧。我还有 250 000 部喜剧。现在我想按流派=喜剧进行电影分页。我如何才能从所有喜剧中获得 20 条记录。如果我使用 @Embedded 或 @Reference 注释,我仍然会立即获得整个列表。在控制器中使用它太大了。

4

2 回答 2

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

于 2013-01-07T08:26:13.540 回答
0

我对 Mongo 不太熟悉,但看起来您需要在此处实现自定义查询。无论您做什么,您都需要为您的页面传递一个开始,以及一个页面大小(在您的情况下为 20)。

您可以通过在查询中组合 .offset(page_start) 和 .limit(page_size) 在 Morphia 中进行分页。因此,首先您将创建一个查询以获取属于某种类型的电影,然后应用分页。

看起来它是使用 Spring http://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 回答