当前位置: 首页 > 知识库问答 >
问题:

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

海嘉赐
2023-03-14

使用Spring-Data,您可以使用@Document注释来指定将对象保存到哪个集合。假设我有两个类,学生和教师,都持久化到人员集合中。当我执行以下代码时:

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

结果包含学生和教师。查看由Spring数据创建的数据,每个文档都包含一个“\u class”字段,该字段指示它从哪个类持久化。

这是在查找中未用作过滤器以仅返回教师的字段?除了这样做之外,我如何仅查询教师:

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

共有2个答案

韩英锐
2023-03-14

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

query.restrict(Teacher.class,Teacher.class);
寿翰飞
2023-03-14

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

我们考虑向查询中添加一些API,以表示只想获取以下给定类型的文档:

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

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

另一种选择是存储一个类可分配给的所有类型(几乎所有接口和超类,但对象除外),但这会导致存储大量数据。这可以通过在文档注释中添加标志来实现。

一句话:目前,没有其他方法,但如果你有如何改进的建议,请随意提高JIRA门票。

 类似资料:
  • 我必须将属于多个实体的数据存储在一个集合中。但是当我查询然后返回时,我不希望结果中出现不需要的记录。我们如何使用Spring实现这一点?以下是我迄今为止所做的。 1.我在实体中给出相同的集合名称,如下所示。 2、我创建独立的mongoRepository接口 3.问题是 当我做animalRepo的时候。芬德尔或humanRepo。芬德尔,我收集了所有的记录。 4.我所期望的 AnimalRepo

  • 所以整个问题是如何在给定的数据集中查询命名模型的组合。

  • 问题内容: 是否可以使用Spring Data Rest为同一JPA实体发布两个不同的存储库?我给两个存储库提供了不同的路径和rel-name,但是这两个存储库中只有一个可以用作REST端点。我拥有两个存储库的要点是,其中一个是摘录,仅显示实体的基本字段。 问题答案: 可怕的部分不仅是你只能有1个弹簧数据仓库休息(@RepositoryRestResource)每实体,但也说,如果你有一个普通JP

  • 有没有可能用Spring Data Rest为同一个JPA实体发布两个不同的存储库?我给了这两个存储库不同的路径和rel名称,但是其中只有一个可用作RESTendpoint。我有两个存储库的关键是,其中一个是摘录,只显示实体的基本字段。

  • 在我的AppMapper.xml中,我有一个查询,如: 假设它将返回姓名,地址,年龄,职业,这些都是字符串。我用这个对吗? *我正在询问是使用resultType=String还是使用resultMap“PersonProfileObj” 我的理解正确吗?

  • 在Firestore中,我有一个用户集合,在每个用户文档中存储一个名为favorites的集合,该集合包含标记为favorites(存储)的文档的ID 我可以采取另一种方法来获取两个集合并手动过滤它们,但我使用的是Firebase RecycerView适配器,它显示的所有数据都基于查询,这将使事情更加高效。 这样的结果是如何实现的呢?如果需要进一步的解释,请告诉我