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

6
使用Spring-Data,您可以使用@Document注释来指定将对象保存到哪个集合中。假设我有两个类,Student和Teacher,都持久化到people集合中。当我执行以下代码时:
mongo.find(new Query(), Teacher.class);

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

这个字段不能用作筛选器来仅返回教师吗?除了执行以下操作外,我如何查询仅限教师:

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

3
这更多或少是关于如何设计你的集合的问题。由于Mongo不知道任何类型,我们必须添加附加元数据才能区分文档。因此,在查询时,您还需要将这些约束条件添加到查询中。请注意,您可以通过DefaultMongoTypeMapper.DEFAULT_TYPE_KEY引用_class键。
我们考虑添加一些API来表达只想获取给定类型文档的请求,例如:
mongo.find(new Query(Teacher.class), Teacher.class);

感觉有些奇怪的是你需要两次声明域类(如果要将结果限制为给定类型的文档并将其映射到不同的类,则这是有道理的)。除此之外,我们只能将结果限制为携带完全相同类型的文档,因为类型存储为字符串且只有在加载了类时才能应用继承。因此,当查询具有Person类型的文档时,我们必须首先加载所有文档,尝试查找类型,进行类型检查并可能丢弃结果,这对于性能来说是不太优秀的。

另一种选择是存储可分配给类的所有类型(几乎所有接口和超类,除了Object),但这会导致存储了相当数量的数据。反过来可以通过向@Document注释添加标志来解决这个问题。

底线:目前,没有其他方法,但如果您有建议如何改进,请随时提出JIRA工单。


谢谢 Oliver,如果我想到一个好的解决方案,我会提出一个工单。 - ltfishie
浏览了mongodb Jira,我发现了这个票 https://jira.springsource.org/browse/DATAMONGO-128 ,标记为1.0.M3已经修复。这个问题在源代码中还存在吗? - ltfishie
是的,但这并不涉及到您的情况。该票证涵盖了能够将“Person”和“Teacher”存储在同一集合中,并能够查询对象并获取实例化的“Person”和“Teacher”的能力(因此需要类型信息)。它实际上并没有考虑改进“仅读取‘Teacher’对象”的情况。 - Oliver Drotbohm

3
这是这个问题的最佳解决方案:
query.restrict(Teacher.class,Teacher.class);

4
为了更好地帮助发帖者,提供关于建议答案的更多细节将非常有益。 - Hawk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接