【问题标题】:Using ObjectId as String in Java (Manual reference) with spring-data mongodb在 Java 中使用 ObjectId 作为字符串(手动参考)和 spring-data mongodb
【发布时间】:2018-06-09 04:28:18
【问题描述】:

在 MongoDB 文档中,他们建议使用 ObjecId 进行手动参考。 请看https://docs.mongodb.com/manual/reference/database-references/#document-references

original_id = ObjectId()

db.places.insert({
    "_id": original_id,
    "name": "Broadway Center",
    "url": "bc.example.net"
})

db.people.insert({
    "name": "Erin",
    "places_id": original_id,
    "url":  "bc.example.net/Erin"
})

我正在使用 spring-data-mongodb,而我正在寻找的是像这样定义的 People 类:

@Document
public class People {

    private String name;
    @Reference // or any Annotation to convert an ObjectId to a String
    private String placesId; 
    private String url;
}

如何在 mongoDB 中将“places_id”作为 ObjectId 但映射到我们的 POJO 中的字符串?

我期待有一个像 @Reference 这样的注释,但它似乎没有实现。

我不明白为什么我们在 spring-data-mongodb 中没有这种注解。对于所有使用手动参考的文档,我不想像spring documentation 中建议的那样实现显式转换器。 也许这不是正确的方法。

我错过了什么吗?

更新:

我喜欢只使用 String 而不是 ObjectId 的 POJO。假设我有一个像这样的类Place

@Document
public class Place {
  @Id
  private String id;
  private String name;
}

place.getId() 将是一个字符串,但people.getPlaceId() 将是一个 ObjectId。我想避免这种不必要的映射。

【问题讨论】:

    标签: java spring mongodb spring-data


    【解决方案1】:

    如果您想真正引用数据库中的其他对象,请使用Spring Data 提供的@DBRef 注释。

    您更新后的代码可能如下所示:

    @Document
    public class People {
    
        private String name;
    
        @DBRef
        private Place place; 
        private String url;
    }
    

    Spring Data 然后会自动将Place 对象映射到您的People 对象。在内部,这是通过引用唯一的 ObjectId 来完成的。试试这段代码,看看你的 mongo 数据库。

    欲了解更多信息,请查看:MongoDb with java foreign key

    【讨论】:

      【解决方案2】:

      解决办法是:

      import org.springframework.data.mongodb.core.mapping.Field;
      import org.springframework.data.mongodb.core.mapping.FieldType;
      
      public class People {
      
          @Field(targetType = FieldType.OBJECT_ID)
          private String placesId; 
      }
      

      这会将 POJO 字符串映射到 MongoDB 中的 ObjectId。

      【讨论】:

      • 如果有List<String>而不是String怎么办?我的意思是对象 ID 列表。
      • 好问题。我可能会提出Spring Data MongoDB GitHub project 的票,因为有人会要求Set 而不是List 等等。
      【解决方案3】:

      为什么不将该字段保留为 ObjectId?

      @Document
      public class People {
      
          private String name;
          private ObjectId placesId; 
          private String url;
      }
      

      如果你想通过这个字段查询你可以这样做:

      • 对于列表

        List<String> ids // the ids as strings
        List<ObjectId> objIds = ids .stream()
                                    .map(i -> new ObjectId(i))
                                    .collect(Collectors.toList());
        
      • 对于单个字符串

        String id // single id
        ObjectId objId = new ObjectId(id);
        

      【讨论】:

      • 谢谢亚历克斯。我已经用更多细节更新了我的问题,因为我想避免这种映射。但是你的建议是有效的。
      • 不幸的是,还没有提供具体的注释。仅字段 _id is handled in the mapping layer使用 MappingMongoConverter 时,有一些规则可以控制 Java 类中的属性如何映射到这个 _id 字段
      • 但是你可以考虑自定义MappingMongoConverter
      【解决方案4】:

      我有一个非常简单的解决方案:

      @JsonSerialize(using= ToStringSerializer.class)
      private ObjectId brandId;
      ...
      

      把它放在 Object Id 的属性上,ObjectId 像字符串一样获取和插入

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-06
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        相关资源
        最近更新 更多