2013-06-15 7 views
7

Ho creato un indice sparse e univoco sulla mia raccolta mongodb.Indice sparse unico di Mongodb

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

E 'stato creato correttamente:

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

Ma se inserisco un secondo documento con una chiave non set riceverò questo errore:

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

Eventuali suggerimenti?

+0

puoi verificare nella raccolta, se c'è qualche documento con 'null' per campo di posta elettronica. Potrebbe accadere che il motore di template che stai utilizzando stia inserendo un valore nullo per quel campo. Controllo localmente, sta funzionando bene. –

+0

Impostando 'email' su' unique', è necessario che sia univoco per ogni documento nella raccolta. Ad esempio, solo un valore 'nullo'. Quindi, sembra che funzioni come previsto. – WiredPrairie

+0

Ho appena risposto a questa domanda: http://stackoverflow.com/questions/17114851/mongo-id-field-duplicate-key-error/17115770#17115770 - è molto simile (e probabilmente lo stesso) problema. – WiredPrairie

risposta

10

Ho appena avuto questo problema anche. Volevo che un valore fosse nullo o unico. Così, ho impostato sia i unique ei sparse bandiere:

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

E, ho fatto in modo che il database aveva effettivamente creato l'indice correttamente con db.users.getIndexes();

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

(Quindi, questo non è lo stesso del problema qui: mongo _id field duplicate key error)

L'errore era impostare il valore default su null. In un certo senso, Mongoose conta un null esplicito come valore che deve essere univoco. Se il campo non viene mai definito (o undefined), non viene applicato per essere univoco.

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

Quindi, se si hanno questo problema troppo, assicurarsi che non sta impostando i valori di default, e assicurarsi che non sta impostando i valori per null altrove nel codice sia. Invece, se è necessario impostarlo in modo esplicito, impostarlo su undefined (o un valore univoco).