mongodb - 如何使用 @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)
解决方案
这里要提几件事。
如果你想要这种表之间的连接,那么你需要重新考虑你选择 Mongodb 作为数据库。没有 Sql 数据库会因为表(集合)之间的耦合非常少而蓬勃发展。因此,如果您正在使用
@DBRef
,它会否定它。Mongodb 自己不推荐使用@DBRef
.使用存储库中的方法无法实现这一点。您需要使用投影。这是相关的文档。
像这样创建一个投影界面。在这里您可以控制需要在 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);
}