dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/mongodb-e11000-duplicate-key-error
MongoDB
MongoDB 6.0 - 8.0Yazma & İndeks
3 dk okuma
E11000 duplicate key error collection: prod.users index: email_1 dup key: { email: "a@b.com" }

MongoDB Benzersiz İndeks Çakışması: Eşzamanlı İstek Yarışı, Upsert Hataları ve İdempotent Yazma

Aynı anahtara sahip iki dokümanın eşzamanlı eklenmesiyle oluşan E11000 hatasının tespiti, getIndexes denetimi ve $setOnInsert ile upsert desenleri.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: MongoDB 6.0 / 7.0 / 8.0

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 2 Kasım 2026
Test Edilen SürümlerMongoDB 7.0.8, 8.0.1 (Docker / Atlas / Ubuntu 24.04)
Gerekli YetkireadWrite role on database
Risk Seviyesi
MediumToplu insertMany(docs, {ordered: true}) kullanıldığında ilk E11000 hatasında tüm sonraki eklemeler durur
Beklenen ÇıktıgetIndexes çıktısında unique indeks doğrulaması ve upsert işleminin başarıyla tamamlanması
Geri Dönüş (Rollback) Planı:Mükerrer dokümanı silme veya index drop
MongoDB Docs: Unique Indexes & E11000 Error
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

Uygulama doküman eklerken veya güncellerken işlem reddedilir:

plaintext
MongoServerError: E11000 duplicate key error collection: prod.users index: email_1 dup key: { email: "a@b.com" }

▸Sahada Ne Görürsün?

Kullanıcı kayıt olurken aynı anda iki istek attığında veya arka plan veri eşitleme işçileri çalıştığında biri başarılı olurken diğeri E11000 ile düşer.


▸Kök Neden Matrisi

OlasılıkKök NedenAçıklama
%65Eşzamanlı İstek Yarışı (Race Condition)İki thread önce findOne yapıp olmadığını teyit eder, ardından ikisi de insertOne çağırınca ikinci istek unique index'e çarpar.
%25`insertMany` Ordered VarsayılanıToplu eklemede tek bir duplikasyon olduğunda ordered: true tüm batch'i abort eder.
%10Null Değerlerin Çakışmasıİndekslenen alan dokümanlarda bulunmadığında (null), birden fazla null değer unique kısıtına takılır.

▸ACİL RUNBOOK (0-5dk)

javascript
// 1. İndeksi ve çakışan dokümanı gör db.users.getIndexes(); db.users.find({ email: "a@b.com" }); // 2. Acil idempotent upsert çözümü: db.users.updateOne( { email: "a@b.com" }, { $set: { last_login: new Date() }, $setOnInsert: { created_at: new Date(), name: "Ali" } }, { upsert: true } ); // 3. Toplu eklemede hatanın diğer satırları durdurmasını engelle db.users.insertMany(docs, { ordered: false });

▸KALICI BLUEPRINT

  1. 1Atomik Upsert Standardı: find + insert yerine daima atomik updateOne(..., {upsert: true}) kullanılmalıdır.
  2. 2Partial / Sparse Index: Eksik alanların null çakışması yaratmaması için sparse veya partial filter index tanımlanmalıdır:
javascript
db.users.createIndex({ phone: 1 }, { unique: true, sparse: true });

▸Doğrulama

javascript
db.users.getIndexes().filter(idx => idx.unique);

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (82)