ltf*_*hie 5 mongodb mongodb-java spring-data mongodb-query
使用Spring-Data,您可以使用@Document批注指定要将对象保存到的集合.假设我有两个班,学生和老师,都坚持进入人物收藏.当我执行以下代码时:
mongo.find(new Query(), Teacher.class);
Run Code Online (Sandbox Code Playgroud)
结果包含学生和教师.查看Spring-Data创建的数据,每个文档都包含一个"_class"字段,用于指示从哪个类持久化.
这个字段在查找过程中没有用作仅返回教师的过滤器?除了这样做之外,我如何仅查询教师:
mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class);
Run Code Online (Sandbox Code Playgroud)
这或多或少是一个如何设计你的系列的问题。由于 Mongo 对类型一无所知,我们必须添加额外的元数据才能区分文档。因此,在查询时,您还需要将这些约束添加到查询中。_class请注意,您可以通过引用该密钥DefaultMongoTypeMapper.DEFAULT_TYPE_KEY。
我们考虑向查询添加一些 API,以表达只想获取给定类型的文档,如下所示:
mongo.find(new Query(Teacher.class), Teacher.class);
Run Code Online (Sandbox Code Playgroud)
必须两次声明域类仍然感觉有点奇怪(如果您想将结果限制为给定类型的文档但将它们映射到不同的类,这是有意义的)。除此之外,我们只能将结果限制为携带该类型的文档,因为类型存储为字符串,并且只有在类已经加载时才能应用继承。因此,当查询具有类型的文档时,Person我们必须首先加载所有文档,尝试查找类型,进行类型检查,并可能丢弃由于性能原因而次优的结果。
另一种选择是存储一个类可分配给的所有类型(几乎所有接口和超类,Object也许除外),但这会导致存储大量数据。这可以通过向注释添加标志来解决@Document。
底线:目前,没有其他办法,但如果您有如何改进的建议,请随时提出 JIRA 票。
| 归档时间: |
|
| 查看次数: |
4761 次 |
| 最近记录: |