我在编写代码时遇到了困难,无法直接获取用户和声明详细信息.这是我的MongoDB struct ,

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

如果我try 点击这个方法,我会得到一个错误,

未发现能够从org.bson.types.ObjectId型转换为java.lang.String型的转换器

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

而不是private List<Claim> claim

改为Private List<ObjectId> claim

现在,如果我执行一个方法(findByName),我会得到一个用户对象,该对象具有两个声明对象Id ("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000"),然后迭代声明列表,并获得与声明对象Id对应的声明细节.

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

推荐答案

如果使用@DBRef引用User类中的Claim,那么JSON不仅应该包含ID,还应该包含对查找ID的集合的引用,如下所示:

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

这就是Spring数据将Java对象映射到MongoDB的方式.如果从一个空白数据库开始,让Spring创建并保存关系,那么使用

 @DBRef List<Claim> claims;

Mongodb相关问答推荐

MongoDB中的数据类型没有通过数据库Pyspark更改(从字符串到日期)

如何在MongoDB中对两个数组进行分组?

MongoDB与合并对象聚合

mongoose正在抛出Schema的错误has';t已在next.js中注册

MongoDb聚合查询问题

按数组mongodb中的第一个元素排序

将子文档中的所有字段设置为 false,然后在单个查询中将第二个字段设置为 true

MongoDB聚合多条件

MongoDB 中 cursor.count() 和 cursor.size() 之间的区别

使用 nodejs/mongoose 部分更新子文档

.NET 中的 Mongodb 单元测试

NodeJS中的密码重置

有没有办法自动更新 MongoDB 中的两个集合?

如何在 MongoDB 聚合查询中使用 $hint?

文本的 MongoID 数据类型

Mongo按实际上是数字的字符串值排序

mongodb 的计数性能

查询 Mongoid/rails 3 中的嵌入对象(Lower than、Min 运算符和排序)

停止副本集 MongoDB

如何从mongoose中的对象 ID 获取创建日期?