如何映射 MongoDB 的 _id 字段?

打印 上一主题 下一主题

主题 1968|帖子 1968|积分 5904

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Spring Data MongoDB 中,将 Java POJO 的字段映射到 MongoDB 文档的 _id 字段非常直接,紧张通过 @Id 注解(org.springframework.data.annotation.Id)来完成。
以下是映射 MongoDB _id 字段的几种常见方式和关键点:

  • 使用 String 类型作为 ID (最常见):

    • 当 @Id 注解的字段类型是 String 时,Spring Data MongoDB 会将其视为 MongoDB ObjectId 的字符串表示形式。
    • 如果在保存新文档时此 String 字段为 null,MongoDB Java 驱动程序会自动生成一个新的 ObjectId,然后 Spring Data MongoDB 会将其转换为字符串并赋值给该字段。
    • 这是最保举和最方便的方式,因为字符串形式的 ID 更容易在 API、URL 和日记中使用。
    1. import org.springframework.data.annotation.Id;
    2. import org.springframework.data.mongodb.core.mapping.Document;
    3. @Document(collection = "my_entities")
    4. public class MyEntity {
    5.     @Id
    6.     private String id; // 将映射到 MongoDB 的 _id 字段
    7.     private String name;
    8.     // Constructors, getters, setters
    9.     public String getId() {
    10.         return id;
    11.     }
    12.     public void setId(String id) {
    13.         this.id = id;
    14.     }
    15.     public String getName() {
    16.         return name;
    17.     }
    18.     public void setName(String name) {
    19.         this.name = name;
    20.     }
    21. }
    复制代码
    当你保存一个新的 MyEntity 实例且 id 字段为 null 时:
    1. MyEntity entity = new MyEntity();
    2. entity.setName("Test Entity");
    3. mongoTemplate.save(entity); // entity.getId() 现在会有一个自动生成的 ObjectId 字符串
    4. System.out.println(entity.getId()); // 例如:"60c72b941f4b1a3e4c8e4f3a"
    复制代码

  • 使用 org.bson.types.ObjectId 类型作为 ID:

    • 你可以直接使用 MongoDB BSON库提供的 ObjectId 类型。
    • 同样,如果在保存新文档时此 ObjectId 字段为 null,驱动程序会自动生成一个新的 ObjectId。
    1. import org.bson.types.ObjectId;
    2. import org.springframework.data.annotation.Id;
    3. import org.springframework.data.mongodb.core.mapping.Document;
    4. @Document(collection = "products")
    5. public class Product {
    6.     @Id
    7.     private ObjectId id; // 直接使用 ObjectId 类型
    8.     private String productName;
    9.     // Constructors, getters, setters
    10.     public ObjectId getId() {
    11.         return id;
    12.     }
    13.     public void setId(ObjectId id) {
    14.         this.id = id;
    15.     }
    16.     public String getProductName() {
    17.         return productName;
    18.     }
    19.     public void setProductName(String productName) {
    20.         this.productName = productName;
    21.     }
    22. }
    复制代码

  • 使用其他 Java 类型作为 ID (例如 Long, BigInteger):

    • 你也可以使用其他原始类型或对象类型(如 Long, BigInteger)作为 _id。
    • 紧张: 如果使用这些类型,MongoDB 不会自动为你生成 ID。你必须在保存文档之前自己提供一个唯一的 ID 值。如果插入时该字段为 null (对于对象类型) 或默认值 (对于原始类型且你未设置),大概会导致错误或意外行为,具体取决于驱动程序和服务器版本。
    • 这种方式适用于你有外部系统生成 ID,大概 ID 具有特定业务含义的情况。
    1. import org.springframework.data.annotation.Id;
    2. import org.springframework.data.mongodb.core.mapping.Document;
    3. import java.math.BigInteger;
    4. @Document(collection = "items")
    5. public class Item {
    6.     @Id
    7.     private Long itemId; // 使用 Long 类型,需要自己保证唯一性并赋值
    8.     // 或者
    9.     // @Id
    10.     // private BigInteger itemId; // 使用 BigInteger,需要自己保证唯一性并赋值
    11.     private String description;
    12.     // Constructors, getters, setters
    13.     public Long getItemId() {
    14.         return itemId;
    15.     }
    16.     public void setItemId(Long itemId) {
    17.         this.itemId = itemId;
    18.     }
    19.     public String getDescription() {
    20.         return description;
    21.     }
    22.     public void setDescription(String description) {
    23.         this.description = description;
    24.     }
    25. }
    复制代码
    使用自定义ID时:
    1. Item item = new Item();
    2. item.setItemId(12345L); // 必须手动设置 ID
    3. item.setDescription("Custom ID Item");
    4. mongoTemplate.save(item);
    复制代码

  • Java 字段名不一定是 “id”:

    • 被 @Id 注解的 Java 字段的名称可以不是 id。Spring Data MongoDB 依然会将其映射到 MongoDB 文档中的 _id 字段。
    1. import org.springframework.data.annotation.Id;
    2. import org.springframework.data.mongodb.core.mapping.Document;
    3. @Document(collection = "books")
    4. public class Book {
    5.     @Id
    6.     private String bookIsbn; // Java 字段名为 "bookIsbn",但它映射到 MongoDB 的 _id
    7.     private String title;
    8.     // Getters and setters
    9.     public String getBookIsbn() {
    10.         return bookIsbn;
    11.     }
    12.     public void setBookIsbn(String bookIsbn) {
    13.         this.bookIsbn = bookIsbn;
    14.     }
    15.     // ...
    16. }
    复制代码

关键点总结:


  • @Id 注解: 是将 Java 字段标记为 MongoDB _id 的焦点。
  • 自动生成:

    • 仅当 @Id 字段类型为 String 或 org.bson.types.ObjectId,并且在插入新文档时该字段值为 null 时,ID 才会由 MongoDB 驱动自动生成。
    • 其他类型(如 Long, Integer, BigInteger)需要你在应用程序中手动赋值并确保其唯一性。

  • 不可变性: MongoDB 中的 _id 字段一旦设置,就不能被修改。尝试更新 _id 会导致使用失败或创建一个新文档(取决于使用类型)。
  • 唯一性: _id 在其集合中必须是唯一的。MongoDB 会自动为 _id 字段创建唯一索引。
  • @Field("_id"): 通常不需要。@Id 注解本身就隐含了该 Java 字段映射到 BSON 文档的 _id 键。显式使用 @Field("_id") 是多余的。
选择哪种 ID 类型取决于你的具体需求:


  • String (ObjectId 字符串): 通用,方便,保举用于大多数场景。
  • ObjectId: 如果你需要在 Java 代码中直接使用 ObjectId 对象(例如,获取时间戳部门)。
  • Long / BigInteger / 其他自定义类型: 当 ID 有特定业务含义或由外部系统生成时。
在大多数 Spring Boot 应用中,使用 String 类型并让 MongoDB 自动生成 ObjectId 是最简朴和最常见的做法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表