【问题标题】:Mongo Pojo with Spring boot, how to fetch subset of data in a document带有Spring Boot的Mongo Pojo,如何获取文档中的数据子集
【发布时间】:2021-01-16 19:03:33
【问题描述】:

我有一个 Spring Boot 应用程序设置来使用 Mongo 数据 Pojo。我有以下依赖项(我已经排除了杰克逊,而是使用 Gson)-

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- Exclude the default Jackson dependency -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>

我有 2 个类,都指的是同一个集合。唯一的区别是 ModuleB 缺少一些字段 -

@Document("Module")
class ModuleA extends MongoModel{
    int X = 0;
    String Y = "something";
}


@Document("Module")
class ModuleB extends MongoModel{
    String Y = "something";
}

我正在使用 MongoTemplate 来获取数据 -

protected final MongoTemplate template;
@Override
public MongoModel get(Class<? extends MongoModel> cls, Query query) {
    query.addCriteria(Criteria.where("deleted").is(0));
    return template.findOne(query, cls);
}

现在,当我使用 spring 存储库获取 ModuleA 或 ModuleB 的实例/文档时,spring-boot 执行的选择操作是否会存在性能差异(或查询差异)?还是 spring-boot 无论如何都获取了这两种情况下的所有字段,然后用必需的字段填充对象。

上面的例子可能看起来微不足道,但如果我有很多字段或 DBRef 到模块内的另一个文档,我可以在获取数据子集而不是获取整个文档时节省大量处理。

【问题讨论】:

标签: java mongodb spring-boot


【解决方案1】:

为了可维护性和一致性,您不应使用多个 @Document 注释模型来引用同一个 MongoDB 集合。

如果一个模型有例如,它会变得非常混乱。不同的 @Index 注释或数据类型,或者您使用一个模型插入,另一个模型读取或更新。

对于只读操作,不会出现这些问题,但无论如何您都不需要@Document 注释,您可以使用projections,如@prasad_ 所述。

您应该将预测与核心域模型保持在一起,因此将来您不要忘记例如在核心域模型等中重命名投影中的字段后重命名它。

【讨论】:

  • 有道理。谢谢。
  • 但是如果我说选择保留一个糟糕的设计并以这种方式获取数据会发生什么(虽然我不会这样做,但你说的对我来说很有意义)。这个问题旨在了解 spring-mongo-db pojo 数据的内部工作原理。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 2013-08-12
  • 2018-05-27
  • 2020-09-14
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多