之前使用 OracleSequence
很習慣,對於產生唯一且遞增序號功能覺得又快又方便,查了一下 MongoDB 沒有這個功能,於是只好自己土炮一個。
方法
使用 FindOneAndModify
結束。
.
.
.
這樣肯定會被打。
設計概念
於 MongoDB 建立一筆資料(可以是任意 Collection),且該資料有一整數型態欄位。當我們需要 Sequence number 時,只需要去取用它,每次取用時都遞增 1
,並回傳遞增後的結果即可。程式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private static async Task<long> GetAutoIncrementValue() { var globalCollection = MongoHelper.GetGlobalVariableCollection();
var filter = Builders<GlobalVariableEntity>.Filter .Eq(x => x.FieldName, "SequenceNumber"); var update = Builders<GlobalVariableEntity>.Update .Inc(x => x.FieldValue, 1); var option = new FindOneAndUpdateOptions<GlobalVariableEntity> { IsUpsert = false, ReturnDocument = ReturnDocument.After };
var entity = await globalCollection .WithReadPreference(ReadPreference.Primary) .FindOneAndUpdateAsync( filter, update, option);
return entity.FieldValue; }
|
這邊要特別注意的是,一定要限定在 Primary
,當有 replica set 後,子節點的抄寫肯定會有時間差,在高頻率使用下,絕對會重複的。除此之外,最好在程式階段確保 singleton
。
網路上有些方法是在 js 階段實作,物理上是更快的方式,但使用情就不太適合跨多個模組。因為是個簡單的小功能,就沒花太多時間再找更多資料,如果有更好的方式也可以建議給我。