Spring Mongo DB @DBREF
Posted
技术标签:
【中文标题】Spring Mongo DB @DBREF【英文标题】: 【发布时间】:2017-10-30 18:31:21 【问题描述】:我在编写允许以直接方式获取用户和声明详细信息的代码时遇到问题。这是我的 MongoDB 结构,
db.user.find();
user:
"name" : "KSK",
"claim" : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")]
claim:
[
"_id" : "52ffc4a5d85242602e000001",
"claimName" :"XXXX"
,
"_id" : "52ffc4a5d85242602e000000",
"claimName" :"YYY"
]
我的实体类是:
@Document(collection="user")
public class User
@Id
private String id;
private String name;
@DBRef
private List<Claim> claim;
// setter and getter
声明类:
@Document(collection="Claim")
public class Claim
@Id
private String id;
private String claimName;
我有一种方法可以按如下名称获取用户,
public User findByName(String name);
如果我尝试使用此方法会收到一个错误,
找不到能够从org.bson.types.ObjectId
类型转换为java.lang.String
类型的转换器
所以我改变了我的用户实体类,如下所示,
而不是private List<Claim> claim
;
改成Private List<ObjectId> claim
;
现在,如果我执行一个方法(findByName),我会得到一个同时拥有声明对象 ID ("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000")
的用户对象,然后迭代声明列表并获取与声明对象 ID 对应的声明详细信息。
当我执行findByName
方法时,我不想这样做,而是想要获取用户并声明详细信息。我怎样才能实现这个功能?
【问题讨论】:
您使用 Listclaimname
和 JSON 中的 claimName
。我的建议是不要将该 Claim 类设置为单独的 @Document 或只是切换回关系数据库,因为它不是 Mongo 方法。 此外,如果您坚持使用当前架构,您可以尝试在 User.class 中的 List 上方使用 @DBRef,如下所示:
public class ParentModel
@Id
private String id;
private String name;
private ParentType parentType;
private SubType subType;
@DBRef
private List<Model> models;
....
【讨论】:
我错过了在我的帖子中添加 DBRef。现在我已经编辑了它。请看现在。正如您所建议的,如果我使用嵌入式关系,如果嵌入式文档的大小持续增长过多,则会影响读/写性能。这就是为什么我决定使用参考关系。 您将超过 16 mb?那应该是一个巨大的文件。如果您设法通过 List如果您在User
类中使用@DBRef 引用您的Claim
s,那么您的JSON 不仅应该包含ID,还应该包含对可以找到ID 的集合的引用,如下所示:
"name" : "KSK",
"claim" : [
"$ref" : "claim", // the target collection
"$id" : ObjectId("52ffc4a5d85242602e000000")
]
这就是 Spring-Data 将 Java 对象映射到 MongoDB 的方式。如果你从一个空白数据库开始,让 Spring 创建并保存关系,你应该没有问题使用
@DBRef List<Claim> claims;
【讨论】:
如何获取索赔的 user_id ?【参考方案3】:作为@DBRef 的替代品,请查看 RelMongo (link) 它提供了一种管理关系的强大方法,在您的情况下,它将是这样的:
@OneToMany(fetch = FetchType.LAZY)
private list<Claim> claims;
【讨论】:
以上是关于Spring Mongo DB @DBREF的主要内容,如果未能解决你的问题,请参考以下文章
基于 Spring WebFlux/Reactive Mongo 的应用程序打开到 mongo db 的多个连接
如何在 Spring Boot 中自动增加 mongo db?
在 Mongo Db 中更新相关文档后 Spring 用户身份验证不起作用
Spring with mongo-java-driver 使用 Azure Cosmos DB 作为 MongoDB