如何使用@Query -> Spring 数据 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)

这里要提到几件事。

  1. 如果您想要在表之间进行这种连接,那么您需要重新考虑将Mongodb作为数据库的选择。任何Sql数据库都不会因为表(集合(之间的耦合非常少而蓬勃发展。因此,如果您使用@DBRef,它会否定这一点。Mongodb本身并不建议使用@DBRef

  2. 使用存储库中的方法无法实现这一点。你需要使用投影。这是相关文档
    创建这样的Porojection接口。在这里,您可以控制哪些字段需要包含在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);
}

最新更新