首页 > 解决方案 > 如何使用 @Query -> Spring data mongo 从 @DBRef 文档中获取数据

问题描述

我需要帮助才能从我有以下课程的另一个文档中获取数据。

@Data
@Document(collection = "tmVersion")
public class TmVersion {

    @Id
    private String id;

    private String cVrVersionId;

    @DBRef
    private TaApplicationVersion taApplicationVersion;
}

@Data
@Document(collection = "taApplicationVersion")
public class TaApplicationVersion {

    @Id
    private String id;

    private String dVrAppName;

    private String dVrAppCode;

}

这是我的存储库,我在其中映射我想要显示的内容,但在 taApplicationVersion 我需要显示所有这些对象,它是如何完成的?

@Query(value="{}", fields="{'cVrVersionId': 1, 'taApplicationVersion.dVrAppName': 2, 
'dVrVersionNumber': 3}") 
Page<TmVersion> getAllVersionWithOutFile(Pageable pageable)

标签: mongodbspring-dataspring-data-mongodb

解决方案


这里要提几件事。

  1. 如果你想要这种表之间的连接,那么你需要重新考虑你选择 Mongodb 作为数据库。没有 Sql 数据库会因为表(集合)之间的耦合非常少而蓬勃发展。因此,如果您正在使用@DBRef,它会否定它。Mongodb 自己不推荐使用@DBRef.

  2. 使用存储库中的方法无法实现这一点。您需要使用投影。是相关的文档。
    像这样创建一个投影界面。在这里您可以控制需要在 Main 类中包含哪些字段(TmVersion)

    @ProjectedPayload
    public interface TmVersionProjection {
    
      @Value("#{@taApplicationVersionRepository.findById(target.taApplicationVersion.id)}")
      public TaApplicationVersion getTaApplicationVersion();
      public String getId();
      public String getcVrVersionId();
    }
    

像这样更改 TmVersionRepository

public interface TmVersionRepository extends MongoRepository<TmVersion, String> {

    @Query(value="{}")
    Page<TmVersionProjection> getAllVersionWithOutFile(Pageable pageable);
}

为 TaApplicationVersion 创建一个新的存储库。您可以@Query在此方法之上添加并控制需要返回子类中的哪些字段。

public interface TaApplicationVersionRepository extends MongoRepository<TaApplicationVersion, String> {
      TaApplicationVersion findById(String id);
}

推荐阅读