繁体   English   中英

使用 Spring-data mongodb 在 Java 中使用 ObjectId 作为字符串(手册参考)

[英]Using ObjectId as String in Java (Manual reference) with spring-data mongodb

在 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;
}

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

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

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

我错过了什么吗?

更新:

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

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

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

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

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

@Document
public class People {

    private String name;

    @DBRef
    private Place place; 
    private String url;
}

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

有关更多信息,请查看: 带有 java 外键的 MongoDb

为什么不将该字段保留为 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);

解决方案是:

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。

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

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

把它放在对象 ID 的属性上,对象 ID 像字符串一样获取和插入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM