带有弹簧的数据,你可以使用@Document批注指定哪个收集对象保存。 说我有两个班,学生和老师,都坚持到人收藏。 当我执行下面的代码:
mongo.find(new Query(), Teacher.class);
结果包含两个学生和教师。 展望由Spring-数据创建的数据,每个文档都包含一个“_class”字段,指示哪些类是从坚持。
这不是在找使用域作为一个过滤器,只返回老师? 我如何查询比这样对方才老师:
mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class);
这是如何设计你的收藏或多或少的问题。 由于蒙戈不知道什么类型的,我们必须添加额外的元数据,以便能够相互区分的文件。 因此查询时,您需要这些限制添加到查询也是如此。 请注意,您可以参照_class
通过关键DefaultMongoTypeMapper.DEFAULT_TYPE_KEY
。
我们想过增加了一些API来查询,以表达一个只想得到一个给定类型像这样的文件:
mongo.find(new Query(Teacher.class), Teacher.class);
它仍然感觉有点怪,你必须声明域类的两倍(这是有道理的,如果你想结果限制为特定类型的文件,但它们映射到一个不同的类)。 除此之外,我们只能结果限制为携带正是型的各类存储为字符串,如果类已经被加载只能应用于继承文件。 因此,查询与类型的文档时Person
,我们就必须先加载所有文档,请尝试查找的类型,做类型检查,并可能丢掉其结果是次优的性能的原因。
另一种选择是将存储所有类型一类是分配给(几乎所有的除外接口和超类Object
可能),但会导致存储数据的相当量。 这可能是反过来通过增加一个标志到接近@Document
注解。
底线:目前,有没有其他的方式,但随意提高门票JIRA如果您有任何建议如何能得到改善。
这是这个问题的最佳解决方案:
query.restrict(Teacher.class,Teacher.class);
文章来源: Spring-Data mongodb querying multiple classes stored in the same collection