Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Mongo DB@DBREF_Java_Mongodb_Spring Mongo_Spring Mongodb - Fatal编程技术网

Java Spring Mongo DB@DBREF

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; //

我在编写代码时遇到了困难,无法以简单的方式获取用户和声明详细信息。这是我的MongoDB结构

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?