MongoDB 實現 Oracle Sequence

之前使用 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 階段實作,物理上是更快的方式,但使用情就不太適合跨多個模組。因為是個簡單的小功能,就沒花太多時間再找更多資料,如果有更好的方式也可以建議給我。

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。