如何使用@Query -> Spring data mongo 从@DBRef 文档获取数据

How can I get data from @DBRef document using @Query -> Spring data mongo

我需要帮助从另一个文档中获取数据我有以下 class。

@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)

这里有几件事要提。

  1. 如果你想在表之间进行这种连接,那么你需要重新考虑你选择 Mongodb 作为数据库。否 Sql 数据库之所以繁荣,是因为表(集合)之间的耦合非常少。因此,如果您使用 @DBRef,它会否定这一点。 Mongodb自己不推荐使用@DBRef.

  2. 这不能像您在存储库中那样使用方法来实现。您需要使用投影。 Here 是相关文档。
    像这样创建一个投影接口。在这里您可以控制您需要在 Main class(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 并控制需要返回 subclass 中的哪些字段。

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