快速解決mongodb出現id重複問題

大雄45發表於2022-12-10
導讀 近期在使用mongodb的過程中遇到一次表中有_id欄位重複的記錄(相同_id的有兩條),著實嚇了一大跳,這篇文章主要給大家介紹了關於mongodb出現id重複問題的簡單解決辦法,需要的朋友可以參考下
背景

今天遇到mongodb在插入資料時出現id重複錯誤,具體錯誤程式碼如下:

duplicate key error collection: index: id dup key: { : ObjectId(‘59a3b9275f063c20cc8bdec7') }',

覺得奇怪 id不是自己生成的,怎麼會這樣呢 。

於是查了下ObjectId 。

ObjectId 的結構

這些是 _id 的一些主要特徵的摘要:

_id 是集合中文件的主鍵,用於區分文件(記錄)。

_id自動編入索引。指定 { _id: } 的查詢將 _id 索引作為其指南。

預設情況下,_id 欄位的型別為 ObjectID,是 MongoDB 的 BSON 型別之一。如果需要,使用者還可以將 _id 覆蓋為 ObjectID 以外的其他內容。

ObjectID 長度為 12 位元組,由幾個 2-4 位元組的鏈組成。每個鏈代表並指定文件身份的具體內容。以下的值構成了完整的 12 位元組組合:

一個 4 位元組的值,表示自 Unix 紀元以來的秒數

一個 3 位元組的機器識別符號

一個 2 位元組的程式 ID

一個 3 位元組的計數器,以隨機值開始

通常,如果文件尚未分配 _id 值,MongoDB 將自動生成一個 _id 值。

嘗試

我的程式碼大概是這樣的 ,批次插入

Collectwrite.InsertMany(item);

後面測試了下乾脆改成單個新增

  foreach(var item in list)
 
  {
 
Collectwrite.InsertOne(item);
 
}

也是報錯。

Collectwrite.InsertOne(item);
 
             Thread.Sleep(500);

再後來降速新增,錯誤依舊。

解決辦法

百度了一下,發現很多人都出現了類似問題,資料庫的id是根據 時間戳+主機+程式號+序列生成的。重複的原因可能有兩種:

內部原因:同時插入兩條資料,導致資料庫生成了同一個id值。

外部原因:每次使用同一個變數儲存不同的資料,導致資料庫認為每次儲存的是同一條資料,最終生成同一個id值。

以上都有個共同點,就是讓資料庫自己生成id值。於是乾脆換個思路

自己手動新增id值,當插入的資料帶有_id的欄位時,mongodb就不再自動生成id。至此, mongodb重複id的問題就解決了。 item.Id = ObjectId.GenerateNewId().ToString();

Collectwrite.DeleteMany(x => x.SeasonId == seasonId);
        foreach(var item in list)
 
        {
 
            item.Id = ObjectId.GenerateNewId().ToString();
 
            Collectwrite.InsertOne(item);
 
            Thread.Sleep(500);
 
        }
 
         
 
    }

到此這篇關於mongodb出現id重複問題的簡單解決辦法的文章就介紹到這了

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2851970/,如需轉載,請註明出處,否則將追究法律責任。

相關文章