映射MongoDB _id字段的几种常见方式
作者:冰糖心书房
在 Spring Data MongoDB 中,将 Java POJO 的字段映射到 MongoDB 文档的 _id 字段非常直接,主要通过 @Id 注解(org.springframework.data.annotation.Id)来完成,本文介绍了映射 MongoDB _id 字段的几种常见方式和关键点,需要的朋友可以参考下
在 Spring Data MongoDB 中,将 Java POJO 的字段映射到 MongoDB 文档的 _id 字段非常直接,主要通过 @Id 注解(org.springframework.data.annotation.Id)来完成。
以下是映射 MongoDB _id 字段的几种常见方式和关键点:
1、使用 String 类型作为 ID (最常见):
- 当
@Id注解的字段类型是String时,Spring Data MongoDB 会将其视为 MongoDBObjectId的字符串表示形式。 - 如果在保存新文档时此
String字段为null,MongoDB Java 驱动程序会自动生成一个新的ObjectId,然后 Spring Data MongoDB 会将其转换为字符串并赋值给该字段。 - 这是最推荐和最方便的方式,因为字符串形式的 ID 更容易在 API、URL 和日志中使用。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "my_entities")
public class MyEntity {
@Id
private String id; // 将映射到 MongoDB 的 _id 字段
private String name;
// Constructors, getters, setters
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
当你保存一个新的 MyEntity 实例且 id 字段为 null 时:
MyEntity entity = new MyEntity();
entity.setName("Test Entity");
mongoTemplate.save(entity); // entity.getId() 现在会有一个自动生成的 ObjectId 字符串
System.out.println(entity.getId()); // 例如:"60c72b941f4b1a3e4c8e4f3a"
2、使用 org.bson.types.ObjectId 类型作为 ID:
- 你可以直接使用 MongoDB BSON库提供的
ObjectId类型。 - 同样,如果在保存新文档时此
ObjectId字段为null,驱动程序会自动生成一个新的ObjectId。
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "products")
public class Product {
@Id
private ObjectId id; // 直接使用 ObjectId 类型
private String productName;
// Constructors, getters, setters
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
}
3、使用其他 Java 类型作为 ID (例如 Long, BigInteger):
- 你也可以使用其他原始类型或对象类型(如
Long,BigInteger)作为_id。 - 重要: 如果使用这些类型,MongoDB 不会自动为你生成 ID。你必须在保存文档之前自己提供一个唯一的 ID 值。如果插入时该字段为
null(对于对象类型) 或默认值 (对于原始类型且你未设置),可能会导致错误或意外行为,具体取决于驱动程序和服务器版本。 - 这种方式适用于你有外部系统生成 ID,或者 ID 具有特定业务含义的情况。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigInteger;
@Document(collection = "items")
public class Item {
@Id
private Long itemId; // 使用 Long 类型,需要自己保证唯一性并赋值
// 或者
// @Id
// private BigInteger itemId; // 使用 BigInteger,需要自己保证唯一性并赋值
private String description;
// Constructors, getters, setters
public Long getItemId() {
return itemId;
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
使用自定义ID时:
Item item = new Item();
item.setItemId(12345L); // 必须手动设置 ID
item.setDescription("Custom ID Item");
mongoTemplate.save(item);
4、Java 字段名不一定是 “id”:
- 被
@Id注解的 Java 字段的名称可以不是id。Spring Data MongoDB 依然会将其映射到 MongoDB 文档中的_id字段。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "books")
public class Book {
@Id
private String bookIsbn; // Java 字段名为 "bookIsbn",但它映射到 MongoDB 的 _id
private String title;
// Getters and setters
public String getBookIsbn() {
return bookIsbn;
}
public void setBookIsbn(String bookIsbn) {
this.bookIsbn = bookIsbn;
}
// ...
}
关键点总结:
@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 是最简单和最常见的做法。
以上就是映射MongoDB _id字段的几种常见方式的详细内容,更多关于映射MongoDB的_id字段的资料请关注脚本之家其它相关文章!
