6

使用 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);
4

2 回答 2

3

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

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

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

您必须两次声明域类仍然感觉有点奇怪(如果您想将结果限制为给定类型的文档但将它们映射到不同的类,这很有意义)。除此之外,我们只能将结果限制为恰好携带该类型的文档,因为类型存储为字符串,并且只有在已经加载类的情况下才能应用继承。因此,当查询具有类型的文档时,Person我们必须首先加载所有文档,尝试查找类型,进行类型检查并可能丢弃出于性能原因而次优的结果。

另一种选择是存储类可分配给的所有类型(几乎所有接口和超类,但Object可能除外),但这会导致存储大量数据。这可以通过在@Document注释中添加标志来解决。

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

于 2012-05-03T05:54:33.153 回答
3

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

query.restrict(Teacher.class,Teacher.class);
于 2014-08-14T03:06:00.880 回答