2013-06-15 21 views
7

Benim mongodb koleksiyonumda seyrek ve benzersiz bir dizin oluşturdum.Mongodb benzersiz seyrek dizin

{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null } 

Ama bir anahtarla ikinci bir belge eklerseniz bu hatayı alıyorsunuz seti değil:

var Account = new Schema({ 
       email: { type: String, index: {unique: true, sparse: true} }, 
         .... 

Bu doğru yaratıldı

{ [MongoError: E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }] 
    name: 'MongoError', 
    err: 'E11000 duplicate key error index: MyDB.accounts.$email_1 dup key: { : null }', 
    code: 11000, 
    n: 0, 
    ok: 1 } 

Herhangi bir ipuçları?

+0

E-posta alanı için 'null' olan herhangi bir belge varsa, koleksiyona bakabilirsiniz. Kullanmakta olduğunuz şablon altyapısı, bu alan için boş değer eklemek olabilir. Yerel olarak kontrol ederim, iyi çalışıyor. –

+0

'E-posta'yı' 'benzersiz 'olarak ayarlayarak, koleksiyondaki her belge için benzersiz olması gerekir. Örneğin sadece bir 'null' değeri. Yani, bu beklendiği gibi çalışıyor gibi geliyor. – WiredPrairie

+0

Sadece şu soruya cevap verdik: http://stackoverflow.com/questions/17114851/mongo-id-field-duplicate-key-error/17115770#17115770 - çok benzer (ve muhtemelen aynı) sorun. – WiredPrairie

cevap

10

Sadece bu sorunu yaşadım. Ya null ya da benzersiz olmak için bir değer istedim. Yani, hem unique ve sparse bayrakları ayarlayın:

var UserSchema = new Schema({ 
    // ... 
    email: {type: String, default: null, trim: true, unique: true, sparse: true}, 
    // ... 
}); 

, ben veritabanı aslında

{ 
    "v" : 1, 
    "key" : { 
    "email" : 1 
    }, 
    "unique" : true, 
    "ns" : "test.users", 
    "name" : "email_1", 
    "sparse" : true, 
    "background" : true, 
    "safe" : null 
}, 

db.users.getIndexes(); ile düzgün indeksi yaratmıştı emin yaptı (Yani, bu değil olduğunu mongo _id field duplicate key error) Hatam null için default değeri ayarı yapıldı

: burada konu olarak aynı. Bir anlamda Mongoose, benzersiz olması gereken bir değer olarak null değerini sayar. Eğer alan asla tanımlanmamışsa (veya undefined), o zaman benzersiz olmaya zorlanmaz. siz de bu sorunu yaşıyorsanız

email: {type: String, trim: true, unique: true, sparse: true}, 

Yani, varsayılan ayarı değerleri değil emin olun ve siz de kodunuzda başka bir yerde null değerleri ayarlayarak değil emin olun. Bunun yerine, bunu açıkça ayarlamanız gerekirse, undefined (veya benzersiz bir değer) olarak ayarlayın.