Spring-Data mongodb查询存储在同一集合中的多个类

时间:2012-05-02 21:25:02

标签: mongodb spring-data mongodb-java mongodb-query

使用Spring-Data,您可以使用@Document批注指定要将对象保存到的集合。假设我有两个班,学生和老师,都坚持进入人物收藏。当我执行以下代码时:

mongo.find(new Query(), Teacher.class);

结果包含学生和教师。查看Spring-Data创建的数据,每个文档都包含一个“_class”字段,用于指示从哪个类持久化。

这是在查找过滤器中仅用于返回教师的字段吗?除了这样做之外,我如何仅查询教师:

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class);

2 个答案:

答案 0 :(得分:2)

这是此问题的最佳解决方案:

query.restrict(Teacher.class,Teacher.class);

答案 1 :(得分:1)

这或多或少是如何设计馆藏的问题。由于Mongo对类型一无所知,我们必须添加额外的元数据以便能够区分文档。因此,在查询时,您还需要将这些约束添加到查询中。请注意,您可以通过_class引用DefaultMongoTypeMapper.DEFAULT_TYPE_KEY密钥。

我们考虑在查询中添加一些API来表达只想获得给定类型的文档,如下所示:

mongo.find(new Query(Teacher.class), Teacher.class);

你必须两次声明域类仍然感觉有点奇怪(如果你想将结果限制为给定类型的文档但将它们映射到不同的类,这是有道理的)。除此之外,我们只能将结果限制为带有完全类型的文档,因为类型存储为字符串,只有在类已经加载时才能应用继承。因此,在查询类型为Person的文档时,我们必须首先加载所有文档,尝试查找类型,进行类型检查并可能丢弃不太理想的结果出于性能原因。

另一种选择是存储一个类可分配的所有类型(几乎所有接口和超类除了Object)但这会导致存储相当多的数据。这可以通过向@Document注释添加标记来实现。

结论:目前,如果你有建议如何改进,可以随意提出JIRA门票。