使用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);
答案 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门票。