当前位置: 首页 > 知识库问答 >
问题:

Spring Mongo DB @DBREF

林项明
2023-03-14

我写代码时遇到了麻烦,这将允许以一种简单明了的方式获取用户和索赔细节。这是我的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);

如果我尝试使用这个方法,会得到一个错误,

找不到能够从类型<code>org.bson.types转换的转换器。ObjectId以键入java.lang.String

所以我更改了我的用户实体类,如下所示,

而不是私有列表

更改为私人列表

现在,如果我执行一个方法(findByName),我会得到一个用户对象,它同时具有声明的对象Id(“52ffc4a5d85242602e0000001”,“52ffc 4a5d 85242600e000000”),然后迭代声明列表并获得与声明对象Id相对应的声明详细信息。

当我执行 findByName 方法时,我想获取用户并声明详细信息,而不是这样做。如何实现此功能?


共有3个答案

贺亦
2023-03-14

作为@DBRef的替代方案,请查看RelMongo(链接),它提供了一种强大的关系管理方法,在您的情况下,它将是这样的:

@OneToMany(fetch = FetchType.LAZY)
private list<Claim> claims;
何志业
2023-03-14

我建议不要将声明类设置到单独的@Document中,或者切换回关系数据库,因为这不是Mongo方法。此外,如果您坚持使用当前的体系结构,您可以尝试在smth中使用User.class中列表上方的@DBRef,如下所示:

public class ParentModel {

    @Id
    private String id;

    private String name;

    private ParentType parentType;

    private SubType subType;

    @DBRef
    private List<Model> models;

....
}
贝嘉泽
2023-03-14

如果使用 @DBRef 引用 User 类中的声明,则 JSON 不仅应包含 ID,还应包含对在其中查找 ID 的集合的引用,如下所示:

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

这就是Spring-Data将Java对象映射到MongoDB的方式。如果你从一个空白数据库开始,让 Spring 创建并保存关系,你应该没有问题使用

 @DBRef List<Claim> claims;
 类似资料:
  • 问题内容: 我在MongoDB中的规范化数据模型结构中遇到以下错误: 这是由于以下原因造成的: 具体的部分。我的文档中有一个DBRef对象,因此我可以引用另一个集合中的文档。嵌入式文档结构不是选项。那么我该如何解决呢? 问题答案: 您必须为其导入DBRef编解码器才能进行打印,如果您希望以文档json样式进行打印,则需要编写自己的DBRef编解码器,并将其添加到您给toJson()的编解码器中。

  • 问题内容: 从Java序列化为JSON时,当使用带有延迟加载和Jackson的多态类型处理的Spring Data MongoDB 批注时,Jackson会为引用的实体生成一个额外的属性。为什么会发生这种情况,并且可以省略多余的属性? 代码示例 生成的JSON 问题答案: “目标”字段由Spring Data添加,因为它是一个惰性集合。因此就像Hibernate for JPA中的datahand

  • 主要内容:DBRefs 与手动引用,使用 DBRefs在《 MongoDB关系》一节中,为了在 MongoDB 中实现规范化的数据库结构,我们使用了引用式关系(也称为手动引用)的概念,在手动引用中,我们需要将被引用文档的 _id 存储在其他文档中。当文档中需要引用来自不同集合数据的情况下,我们可以使用 MongoDB 中的 DBRefs。 DBRefs 与手动引用 假如有这样一个数据库,其中有一个 users 集合,用来存储用户信息,以及其它一些集合

  • 我写了这个程序spring boot mongodb reactive 依赖项: 应用。道具文件: 我的代码在此链接中运行良好: 但是在这个链接中: 代码引发以下错误: 导致此错误的原因是DBRef注释,它根本不起作用。它引发以下异常。我们可以添加这样的配置使其工作吗?提前谢谢你

  • 我试图将一个包含@dbref的对象保存并加载到另一个恰好是子类类型的对象,并且Spring Data MongoDB将该字段加载为NULL。 发生的情况是,对象保存在集合中,并且MongoDB中的值为并且Person文档中的指向而不是。 集合: 集合: 如果使用或加载对象,则字段为空。但是如果我对burger对象使用,则返回person对象。我在这里有什么理解不对的?

  • 我有一个实体Market(Market存储在marketDb数据库中的集合中)引用Product(存储在productDb数据库中的集合产品中)。 /**市场在集合中存储为:*/ 当我尝试通过Id读取市场时,我能够获取市场,但产品返回为NULL。 然而:1。如果product存储在与Market属于同一数据库的集合中,则product将作为read on Market的一部分返回。2.如果在上述代

  • 我是spring数据Mongo的新手,所以我肯定做错了什么,因为我无法执行这样一个简单的查询。这是我的模型: 我想从一个品牌获得所有的模型,所以我实现DAO如下: 如果我在shell中执行这个mongodb查询,它就会工作: 但是,Java应用程序抛出以下异常: 很明显,它在Brand类中查找一个字段$id,但由于它不存在,它失败了。因此,我将查询更改为以下内容,以便它导航到id字段: 现在,它没

  • Mongoose似乎不支持Mongo DBREF。显然,他们发布了“dbref”支持,但它实际上只是简单的引用(不具备引用不同集合中的文档的能力)。我终于创建了一个模式,允许我保存ObjectID引用的数组并填充它们,这对于我的模式的某些部分是很好的,但是如果我可以使用适当的DBREF创建一个数组,允许我引用来自多个集合的文档,那将是非常方便的。 幸运地(?)有一个模块可以在Mongoose中修补