Java Spring Mongo DB@DBREF
我在编写代码时遇到了困难,无法以简单的方式获取用户和声明详细信息。这是我的MongoDB结构Java Spring Mongo DB@DBREF,java,mongodb,spring-mongo,spring-mongodb,Java,Mongodb,Spring Mongo,Spring Mongodb,我在编写代码时遇到了困难,无法以简单的方式获取用户和声明详细信息。这是我的MongoDB结构 db.user.find(); 我的实体类是: @Document(collection="user") public class User{ @Id private String id; private String name; @DBRef private List<Claim> claim; //
db.user.find();
我的实体类是:
@Document(collection="user")
public class User{
@Id
private String id;
private String name;
@DBRef
private List<Claim> claim;
// setter and getter
}
我有一个方法可以通过下面的名称获取用户
公共用户findByName(字符串名);
如果我尝试点击这个方法,我会得到一个错误
找不到能够从类型org.bson.types.ObjectId
转换为类型java.lang.String
所以我改变了我的用户实体类,如下所示
而不是私有列表声明
更改为私人列表索赔
现在,如果我执行一个方法(findByName),我会得到一个同时具有声明对象Id(“52ffc4a5d85242602e00001”、“52ffc4a5d85242602e00001”)
,然后迭代声明列表并获得与声明对象Id对应的声明详细信息
当我执行
findByName
方法时,我不想这样做,而是想获得一个用户和声明详细信息。如何实现此功能?我的建议是不要将声明类设置为单独的@Document,或者切换回关系数据库,因为这不是Mongo方法。
此外,如果您坚持当前的体系结构,您可以尝试将User.class中该列表上方的@DBRef用于smth,如下所示:
public class ParentModel {
@Id
private String id;
private String name;
private ParentType parentType;
private SubType subType;
@DBRef
private List<Model> models;
....
}
{
"name" : "KSK",
"claim" : [
{
"$ref" : "claim", // the target collection
"$id" : ObjectId("52ffc4a5d85242602e000000")
}
]
}
公共类父模型{
@身份证
私有字符串id;
私有字符串名称;
私有父类型父类型;
私有亚型;
@DBRef
私有列表模型;
....
}
如果使用@DBRef引用用户
类中的声明
s,则JSON不仅应包含ID,还应包含对查找ID的集合的引用,如下所示:
public class ParentModel {
@Id
private String id;
private String name;
private ParentType parentType;
private SubType subType;
@DBRef
private List<Model> models;
....
}
{
"name" : "KSK",
"claim" : [
{
"$ref" : "claim", // the target collection
"$id" : ObjectId("52ffc4a5d85242602e000000")
}
]
}
这就是Spring数据将Java对象映射到MongoDB的方式。如果从空白数据库开始,让Spring创建并保存关系,那么使用
@DBRef List<Claim> claims;
@DBRef清单索赔;
作为@DBRef的替代方案,看看RelMongo()
它提供了一种强大的关系管理方法,在您的情况下,它将如下所示:
@OneToMany(fetch = FetchType.LAZY)
private list<Claim> claims;
@OneToMany(fetch=FetchType.LAZY)
私人清单索赔;
我没有在帖子中添加DBRef。现在我已经编辑好了。现在请看。正如您所建议的,如果我使用嵌入式关系,那么如果嵌入式文档的大小持续增长过多,可能会影响读/写性能。这就是我决定使用引用关系的原因。您将超过16MB吗?这应该是一份庞大的文件。如果您设法获得用户与列表,我真的不明白你想要什么以上这一点?Mb如果您解释得更清楚,我会尽力帮助您如果我添加了DBRef private LIST,我会得到一个错误。我在我的帖子中提到了这个错误。我需要的是,当我调用findByName时,我需要一个用户并对应于声明的详细信息。您是否生成了getter和setter?您可以使用Lombok实现这一目的您最初使用List的方法看起来不错。您确定这不是驼峰问题,请参阅Java类中的claimname
,以及JSON中的claimname
。@这只是一个输入错误。我现在已修改。如何获取索赔的用户id?