2013-06-15 6 views
7

Ich habe einen spärlichen und einzigartigen Index auf meiner mongodb Sammlung erstellt.Mongodb einzigartiger spärlicher Index

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

Es wurde korrekt erstellt:

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

Aber wenn ich ein zweites Dokument mit einem Schlüssel einfügen nicht Satz Ich erhalte diese Fehlermeldung:

{ [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 } 

Irgendwelche Hinweise?

+0

können Sie in der Sammlung einchecken, wenn ein Dokument mit dem Feld 'null' für E-Mails vorhanden ist. Es kann vorkommen, dass die von Ihnen verwendete Vorlagen-Engine einen Nullwert für dieses Feld einfügt. Ich überprüfe vor Ort, es funktioniert gut. –

+0

Wenn "email" auf "unique" gesetzt wird, muss es für jedes Dokument in der Sammlung eindeutig sein. Zum Beispiel nur ein "Null" -Wert. Also, das hört sich so an, als ob es wie erwartet funktioniert. – WiredPrairie

+0

Gerade beantwortet diese Frage: http://stackoverflow.com/questions/17114851/mongo-id-field-duplicate-key-error/17115770#17115770 - es ist sehr ähnlich (und wahrscheinlich das gleiche) Problem. – WiredPrairie

Antwort

10

Ich hatte gerade dieses Problem auch. Ich wollte, dass ein Wert entweder null ist oder eindeutig ist. Also, habe ich die beiden unique und die sparse Fahnen:

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

Und ich stellte sicher, dass die Datenbank hatte tatsächlich den Index korrekt mit db.users.getIndexes(); erstellt

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

(Also, das ist nicht das gleiche wie das Problem hier: mongo _id field duplicate key error)

Mein Fehler war die default Wert auf null. In gewissem Sinne zählt Mongoose einen eindeutigen null als einen Wert, der eindeutig sein muss. Wenn das Feld nie definiert ist (oder undefined), wird es nicht als eindeutig erzwungen.

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

Also, wenn Sie dieses Problem zu haben, stellen Sie sicher, dass Sie keine Standardwerte einstellen, und stellen Sie sicher, dass Sie nicht die Werte zu null anderswo in Ihrem Code Einstellung entweder. Wenn Sie es explizit festlegen müssen, legen Sie es stattdessen auf undefined (oder einen eindeutigen Wert) fest.