做西班牙語網(wǎng)站熱門網(wǎng)站
💝💝💝首先,歡迎各位來到我的博客,很高興能夠在這里和您見面!希望您在這里不僅可以有所收獲,同時也能感受到一份輕松歡樂的氛圍,祝你生活愉快!
文章目錄
- 引言
- 一、MongoDB 默認(rèn)的ObjectId
- 二、實現(xiàn)自動增長ID
- 1. 創(chuàng)建自增ID文檔
- 2. 獲取并更新自增ID
- 三、案例代碼:實現(xiàn)自增ID
- 1. 創(chuàng)建自增ID文檔
- 2. 獲取并更新自增ID
- 3. 插入訂單
- 四、并發(fā)場景下的自增ID
- 1. 使用鎖機(jī)制
- 2. 使用事務(wù)
- 五、結(jié)論
引言
在MongoDB中,自動生成或自動增長的ID是許多應(yīng)用場景中的常見需求,特別是在需要連續(xù)編號的情況下。盡管MongoDB默認(rèn)使用ObjectId作為文檔的主鍵,但在某些情況下,開發(fā)者可能需要實現(xiàn)自定義的自增ID機(jī)制。本文將深入探討如何在MongoDB中實現(xiàn)自動增長的ID,并通過具體的案例代碼展示這一過程的每一個細(xì)節(jié)。
一、MongoDB 默認(rèn)的ObjectId
MongoDB 默認(rèn)使用ObjectId作為文檔的_id字段。ObjectId是一個12字節(jié)的BSON類型,由以下四個部分組成:
- 時間戳(4字節(jié)):記錄ObjectId創(chuàng)建時的時間,單位為秒。
- 機(jī)器標(biāo)識符(3字節(jié)):表示生成ObjectId的機(jī)器,前兩字節(jié)是網(wǎng)絡(luò)字節(jié)序的機(jī)器ID,后一字節(jié)是進(jìn)程ID。
- 計數(shù)器(2字節(jié)):每次在同一臺機(jī)器同一進(jìn)程中生成新的ObjectId時,計數(shù)器會遞增。
- 隨機(jī)數(shù)(3字節(jié)):增加隨機(jī)性,降低沖突概率。
二、實現(xiàn)自動增長ID
在某些場景下,如訂單編號、流水號等,需要使用連續(xù)的數(shù)字作為ID。MongoDB 不直接支持自增ID,但可以通過創(chuàng)建一個文檔來模擬實現(xiàn)。
1. 創(chuàng)建自增ID文檔
首先,需要在數(shù)據(jù)庫中創(chuàng)建一個用于存儲自增ID的文檔。
db.auto_incr_ids.insert({ _id: "orders", sequence_value: 0 });
這里,orders
是自增ID的名稱,sequence_value
是當(dāng)前的ID值。
2. 獲取并更新自增ID
每當(dāng)需要一個新的自增ID時,可以通過原子操作獲取并更新該文檔。
db.auto_incr_ids.update({ _id: "orders" },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true }
);
這里,$inc
操作符用于增加 sequence_value
的值,upsert
選項表示如果文檔不存在,則創(chuàng)建新文檔。
三、案例代碼:實現(xiàn)自增ID
假設(shè)我們正在開發(fā)一個電子商務(wù)平臺,需要為每個訂單生成唯一的自增ID。
1. 創(chuàng)建自增ID文檔
db.auto_incr_ids.insert({ _id: "order_numbers", sequence_value: 0 });
2. 獲取并更新自增ID
function getNextSequence(name) {let result = db.auto_incr_ids.findOneAndUpdate({ _id: name },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true });return result.sequence_value;
}let orderId = getNextSequence("order_numbers");
console.log(orderId);
這里,getNextSequence
函數(shù)用于獲取下一個自增ID。
3. 插入訂單
db.orders.insertOne({order_number: getNextSequence("order_numbers"),customer_name: "John Doe",items: [{ product: "T-shirt", quantity: 2 },{ product: "Jeans", quantity: 1 }],total_amount: 99.99
});
四、并發(fā)場景下的自增ID
在高并發(fā)場景下,直接使用 findOneAndUpdate
可能會遇到競態(tài)條件。為了確保線程安全,可以使用鎖機(jī)制或事務(wù)來處理。
1. 使用鎖機(jī)制
const session = db.getMongo().startSession();
session.startTransaction();try {let result = db.auto_incr_ids.findOneAndUpdate({ _id: "order_numbers" },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true, session });session.commitTransaction();
} catch (e) {session.abortTransaction();
} finally {session.endSession();
}
2. 使用事務(wù)
在MongoDB 4.0及以上版本,可以使用事務(wù)來確保操作的原子性。
const session = db.getMongo().startSession();
session.startTransaction();try {let result = db.auto_incr_ids.findOneAndUpdate({ _id: "order_numbers" },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true, session });session.commitTransaction();
} catch (e) {session.abortTransaction();
} finally {session.endSession();
}
五、結(jié)論
自增ID機(jī)制非常適合需要連續(xù)編號的場景,如訂單號、發(fā)票號等。需要注意的是,在高并發(fā)環(huán)境下,要確保并發(fā)安全性,可以使用鎖機(jī)制或事務(wù)來處理。
喜歡博主的同學(xué),請給博主一丟丟打賞吧↓↓↓您的支持是我不斷創(chuàng)作的最大動力喲!感謝您的支持哦😘😘😘
💝💝💝如有需要請大家訂閱我的專欄【MongoDB系列】喲!我會定期更新相關(guān)系列的文章
💝💝💝關(guān)注!關(guān)注!!請關(guān)注!!!請大家關(guān)注下博主,您的支持是我不斷創(chuàng)作的最大動力!!!
MongoDB相關(guān)文章索引 | 文章鏈接 |
---|---|
MongoDB教程(一):Linux系統(tǒng)安裝mongoDB詳細(xì)教程 | MongoDB教程(一):Linux系統(tǒng)安裝mongoDB詳細(xì)教程 |
MongoDB教程(二):mongoDB引用shell | MongoDB教程(二):mongoDB引用shell |
MongoDB教程(三):mongoDB用戶管理 | MongoDB教程(三):mongoDB用戶管理 |
MongoDB教程(四):mongoDB索引 | MongoDB教程(四):mongoDB索引 |
MongoDB教程(五):mongoDB聚合框架 | MongoDB教程(五):mongoDB聚合框架 |
MongoDB教程(六):mongoDB復(fù)制副本集 | MongoDB教程(六):mongoDB復(fù)制副本集 |
MongoDB教程(七):mongoDB分片 | MongoDB教程(七):mongoDB分片 |
MongoDB教程(八):mongoDB數(shù)據(jù)備份與恢復(fù) | MongoDB教程(八):mongoDB數(shù)據(jù)備份與恢復(fù) |
MongoDB教程(九):java集成mongoDB | MongoDB教程(九):java集成mongoDB |
MongoDB教程(十):Python集成mongoDB | MongoDB教程(十):Python集成mongoDB |
MongoDB教程(十一):MongoDB關(guān)系管理與文檔關(guān)聯(lián) | MongoDB教程(十一):MongoDB關(guān)系管理與文檔關(guān)聯(lián) |
MongoDB教程(十二):MongoDB數(shù)據(jù)庫索引 | MongoDB教程(十二):MongoDB數(shù)據(jù)庫索引 |
MongoDB教程(十四):MongoDB查詢分析 | MongoDB教程(十四):MongoDB查詢分析 |
MongoDB教程(十五):MongoDB原子操作 | MongoDB教程(十五):MongoDB原子操作 |
MongoDB教程(十六):MongoDB高級索引 | MongoDB教程(十六):MongoDB高級索引 |
MongoDB教程(十七):MongoDB主鍵類型ObjectId | MongoDB教程(十七):MongoDB主鍵類型ObjectId |
MongoDB教程(十八):MongoDB MapReduce | MongoDB教程(十八):MongoDB MapReduce |
MongoDB教程(十九):MongoDB全文檢索 | MongoDB教程(十九):MongoDB全文檢索 |
MongoDB教程(二十):MongoDB正則表達(dá)式 | MongoDB教程(二十):MongoDB正則表達(dá)式 |
MongoDB教程(二十一):MongoDB大文件存儲GridFS | MongoDB教程(二十一):MongoDB大文件存儲GridFS |
MongoDB教程(二十二):MongoDB固定集合 | MongoDB教程(二十二):MongoDB固定集合 |
??????覺得有用的話點個贊 👍🏻 唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!😄😄😄
💘💘💘如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!🌙🌙🌙