映射MongoDB _id字段的幾種常見方式
在 Spring Data MongoDB 中,將 Java POJO 的字段映射到 MongoDB 文檔的 _id 字段非常直接,主要通過 @Id 注解(org.springframework.data.annotation.Id)來完成。
以下是映射 MongoDB _id 字段的幾種常見方式和關(guān)鍵點(diǎn):
1、使用 String 類型作為 ID (最常見):
- 當(dāng)
@Id注解的字段類型是String時(shí),Spring Data MongoDB 會(huì)將其視為 MongoDBObjectId的字符串表示形式。 - 如果在保存新文檔時(shí)此
String字段為null,MongoDB Java 驅(qū)動(dòng)程序會(huì)自動(dòng)生成一個(gè)新的ObjectId,然后 Spring Data MongoDB 會(huì)將其轉(zhuǎn)換為字符串并賦值給該字段。 - 這是最推薦和最方便的方式,因?yàn)樽址问降?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;
}
}
當(dāng)你保存一個(gè)新的 MyEntity 實(shí)例且 id 字段為 null 時(shí):
MyEntity entity = new MyEntity();
entity.setName("Test Entity");
mongoTemplate.save(entity); // entity.getId() 現(xiàn)在會(huì)有一個(gè)自動(dòng)生成的 ObjectId 字符串
System.out.println(entity.getId()); // 例如:"60c72b941f4b1a3e4c8e4f3a"
2、使用 org.bson.types.ObjectId 類型作為 ID:
- 你可以直接使用 MongoDB BSON庫提供的
ObjectId類型。 - 同樣,如果在保存新文檔時(shí)此
ObjectId字段為null,驅(qū)動(dòng)程序會(huì)自動(dòng)生成一個(gè)新的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):
- 你也可以使用其他原始類型或?qū)ο箢愋停ㄈ?nbsp;
Long,BigInteger)作為_id。 - 重要: 如果使用這些類型,MongoDB 不會(huì)自動(dòng)為你生成 ID。你必須在保存文檔之前自己提供一個(gè)唯一的 ID 值。如果插入時(shí)該字段為
null(對(duì)于對(duì)象類型) 或默認(rèn)值 (對(duì)于原始類型且你未設(shè)置),可能會(huì)導(dǎo)致錯(cuò)誤或意外行為,具體取決于驅(qū)動(dòng)程序和服務(wù)器版本。 - 這種方式適用于你有外部系統(tǒng)生成 ID,或者 ID 具有特定業(yè)務(wù)含義的情況。
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時(shí):
Item item = new Item();
item.setItemId(12345L); // 必須手動(dòng)設(shè)置 ID
item.setDescription("Custom ID Item");
mongoTemplate.save(item);
4、Java 字段名不一定是 “id”:
- 被
@Id注解的 Java 字段的名稱可以不是id。Spring Data MongoDB 依然會(huì)將其映射到 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;
}
// ...
}
關(guān)鍵點(diǎn)總結(jié):
@Id注解: 是將 Java 字段標(biāo)記為 MongoDB_id的核心。- 自動(dòng)生成:
- 僅當(dāng)
@Id字段類型為String或org.bson.types.ObjectId,并且在插入新文檔時(shí)該字段值為null時(shí),ID 才會(huì)由 MongoDB 驅(qū)動(dòng)自動(dòng)生成。 - 其他類型(如
Long,Integer,BigInteger)需要你在應(yīng)用程序中手動(dòng)賦值并確保其唯一性。
- 僅當(dāng)
- 不可變性: MongoDB 中的
_id字段一旦設(shè)置,就不能被修改。嘗試更新_id會(huì)導(dǎo)致操作失敗或創(chuàng)建一個(gè)新文檔(取決于操作類型)。 - 唯一性:
_id在其集合中必須是唯一的。MongoDB 會(huì)自動(dòng)為_id字段創(chuàng)建唯一索引。 @Field("_id"): 通常不需要。@Id注解本身就隱含了該 Java 字段映射到 BSON 文檔的_id鍵。顯式使用@Field("_id")是多余的。
選擇哪種 ID 類型取決于你的具體需求:
String(ObjectId 字符串): 通用,方便,推薦用于大多數(shù)場(chǎng)景。ObjectId: 如果你需要在 Java 代碼中直接操作ObjectId對(duì)象(例如,獲取時(shí)間戳部分)。Long/BigInteger/ 其他自定義類型: 當(dāng) ID 有特定業(yè)務(wù)含義或由外部系統(tǒng)生成時(shí)。
在大多數(shù) Spring Boot 應(yīng)用中,使用 String 類型并讓 MongoDB 自動(dòng)生成 ObjectId 是最簡(jiǎn)單和最常見的做法。
以上就是映射MongoDB _id字段的幾種常見方式的詳細(xì)內(nèi)容,更多關(guān)于映射MongoDB的_id字段的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mongodb主從復(fù)制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了mongodb主從復(fù)制的相關(guān)資料,討論mongodb的部署技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
MongoDB中多表關(guān)聯(lián)查詢($lookup)的深入講解
NoSql的多表關(guān)聯(lián)一直是比較復(fù)雜的問題,下面這篇文章主要給大家介紹了關(guān)于MongoDB中多表關(guān)聯(lián)查詢($lookup)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-12-12
在PyCharm中安裝Mongo Plugin的詳細(xì)教程
這篇文章主要介紹了在PyCharm中安裝Mongo Plugin的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
mongodb基礎(chǔ)之用戶權(quán)限管理實(shí)例教程
這篇文章主要給大家介紹了關(guān)于mongodb基礎(chǔ)之用戶權(quán)限管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
MongoDB 內(nèi)存管理相關(guān)總結(jié)
這篇文章主要介紹了MongoDB 內(nèi)存管理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫,感興趣的朋友可以了解下2021-03-03
Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無法連接服務(wù)器的問題及解決方案
在Windows系統(tǒng)中啟動(dòng)MongoDB時(shí)遇到連接拒絕的錯(cuò)誤,通常是因?yàn)榉?wù)未運(yùn)行或配置問題,本文給大家分享Windows系統(tǒng)啟動(dòng)MongoDB報(bào)錯(cuò)無法連接服務(wù)器的問題及解決方案,一起看看吧2024-10-10
解決MongoDB占用內(nèi)存過大頻繁死機(jī)的方法詳解
這篇文章主要介紹了解決MongoDB占用內(nèi)存過大頻繁死機(jī)的方法詳解,需要的朋友可以參考下2020-02-02
MongoDB?插入操作機(jī)制詳解之insert()?與?nInserted?的行為剖析(推薦)
本文將以一段常見的MongoDB?Shell腳本為切入點(diǎn),深入探討insert()?方法的工作機(jī)制、返回值含義,并對(duì)比insertMany()的差異,幫助開發(fā)者避免常見誤解,寫出更高效、更可控的數(shù)據(jù)寫入代碼,感興趣的朋友一起看看吧2025-11-11

