spring data mongo使用@DBRef,怎么查询指定字段的集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring data mongo使用@DBRef,怎么查询指定字段的集合相关的知识,希望对你有一定的参考价值。

参考技术A 当今NoSQL领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是MongoDB.MongoDB是面向文档的弱结构化存储方案,使用JSON格式来展现、查询和修改数据。 MongoDB文档相当完备,扩展规模与安装一样简单。

Spring Mongo DB @DBREF

【中文标题】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&lt;Claim&gt; claim

改成Private List&lt;ObjectId&gt; claim;

现在,如果我执行一个方法(findByName),我会得到一个同时拥有声明对象 ID ("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000") 的用户对象,然后迭代声明列表并获取与声明对象 ID 对应的声明详细信息。

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

【问题讨论】:

您使用 List 的初始方法看起来不错。您确定这不是驼峰式问题吗,请参阅 Java 类中的 claimname 和 JSON 中的 claimName @Matt 只是一个拼写错误。我现在修改了。 【参考方案1】:

我的建议是不要将该 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 获得用户,我真的不明白您想要什么? Mb,如果您解释得更清楚,我会尽力提供帮助 如果我添加 DBRef 私有列表我得到一个错误。我在帖子中提到了错误。我需要的是,当我调用 findByName 时,我想要一个用户并对应于声明详细信息。 您是否生成了 getter 和 setter?您可以为此目的使用 Lombok【参考方案2】:

如果您在User 类中使用@DBRef 引用您的Claims,那么您的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 data mongo使用@DBRef,怎么查询指定字段的集合的主要内容,如果未能解决你的问题,请参考以下文章

使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef

Mongo 如何使用 DBRef 进行 $lookup

使用 Jackson PTH 和 Spring Data MongoDB DBRef 生成额外目标属性的 Java 到 JSON 序列化

Spring Data MongoDB中的手动引用与DBRef?

使用 spring data mongo 插入 Mongo 文档

如何使用 mongo 搜索集合并返回子文档列表(Spring-data-mongo)