2017-05-30 177 views
3

这是我的MongoDB的结构,春蒙戈DB @DBREF

db.user.find(); 

用户:

{ 
"name" : "KSK", 
"claim" : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")] 
} 

要求:

[ 
    { 
    "_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方法我想获得一个用户和要求的细节。我怎样才能实现这个功能

+0

你用列表的初步做法看起来正常的没有问题。你确定它不是一个骆驼案例,请参阅你的Java类中的''claimname''和JSON中的''claimName''。 – Matt

+0

@Matt它只是一个错字错误。我现在修改了。 – KSK

回答

1

如果您在User类@DBRef,你的JSON引用您Claim小号不应该只包含ID,但参考集合在哪里可以找到ID为好,像这样:

{ 
    "name" : "KSK", 
    "claim" : [ 
    { "$ref":"claim", // the target collection 
     "$id : "ObjectId("52ffc4a5d85242602e000000") 
    } 
    ] 
} 

那是怎样Spring的数据映射您的Java对象的MongoDB。如果你开始一个空白数据库,并让Spring创建和保存的关系,你应该使用

@DBRef List<Claim> claims; 
+0

嗨马特。谢谢你的回答。它工作正常。 – KSK

1

我的建议是不要将该Claim类设置为单独的@Document,或者只是切换回关系数据库,因为它不是Mongo方法。 另外,如果你坚持目前的建筑,你可以尝试使用@DBRef在User.class该列表上方到水木清华这样的:

public class ParentModel { 

    @Id 
    private String id; 

    private String name; 

    private ParentType parentType; 

    private SubType subType; 

    @DBRef 
    private List<Model> models; 

.... 
} 
+0

我错过了在我的文章中添加DBRef。现在我编辑了它。请现在看看。正如你所建议的,如果我使用嵌入式关系,如果嵌入式文档的大小不断增长,它可能会影响读/写性能。这就是为什么我决定参考关系。 – KSK

+0

你会超过16 MB?这应该是一个巨大的文件。如果你设法得到名单用户我不明白你想在这之上? Mb如果你解释得更清楚我将尽力帮助 –

+0

如果我添加DBRef私人列表我收到一个错误。我在文章中提到了这个错误。我需要的是,当我调用findByName时,我需要一个用户并且对应于声明的详细信息。 – KSK