2012-05-02 69 views
5

使用Spring-Data,可以使用@Document注释来指定将对象保存到哪个集合。假设我有两个班,学生和老师,都坚持到人员收藏。当我执行以下代码时:Spring-Data mongodb查询存储在同一集合中的多个类

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

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

这是字段没有用作查找过滤器只返回老师?我如何查询只有教师以外的其他人做这个:

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

回答

1

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

我们想过增加了一些API来查询,以表达一个只想得到一个给定类型像这样的文件:

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

仍觉得有点不可思议,你必须状态域级两次(如果要将结果限制为给定类型的文档,但将它们映射到不同的类上,则这是有意义的。除此之外,我们只能将结果限制为类型完全相同的文档,因为类型存储为字符串,并且只有在类已经加载时才能应用继承。所以当查询Person类型的文档时,我们必须首先加载所有文档,尝试查找类型,进行类型检查并可能丢弃由于性能原因而不是最佳的结果。

另一种选择是存储一个类可分配给的所有类型(几乎所有的接口和超类,除了Object也许),但这会导致大量的数据被存储。这可以通过向@Document注释添加一个标志来接近。底线:目前没有其他办法,但如果您有任何建议可以改进,请随时提出JIRA门票。

+0

感谢奥利弗,如果我拿出一个很好的解决方案,我会养一票。 – ltfishie

+0

通过mongodb Jira,我遇到了这张票https://jira.springsource.org/browse/DATAMONGO-128这是固定的1.0.M3市场。这仍然是来源? – ltfishie

+0

是的,但这并没有触及你的情况。门票可以将'Person'和'Teacher'存储在同一个集合中,并能够从中查询对象并获得Person和Teacher的实例化(因此是所需的类型信息)。它实际上并没有考虑改进“只读”教师对象“场景。 –

1

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

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

提供有关建议答案的更多详细信息对于OP – Hawk

+0

非常有帮助完美,谢谢。 –

相关问题