2013-06-15 9 views
7

Stworzyłem rzadki i unikalny indeks na mojej kolekcji mongodb.Mongodb unikalny rzadki indeks

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

Został utworzony poprawnie:

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

Ale jeśli wstawić drugi dokument z kluczem nie została ustawiona otrzymuję ten błąd:

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

Wszelkie wskazówki?

+0

można sprawdzić w kolekcji, jeśli istnieje dokument o polu "null" dla adresu e-mail. Może się zdarzyć, że mechanizm szablonu, którego używasz, wstawia wartość pustą dla tego pola. Sprawdzam lokalnie, działa dobrze. –

+0

Ustawiając 'email' na' unique', musi być unikatowe dla każdego dokumentu w kolekcji. Na przykład tylko jedna wartość 'null'. Wygląda na to, że działa zgodnie z oczekiwaniami. – WiredPrairie

+0

Właśnie odpowiedziałem na to pytanie: http://stackoverflow.com/questions/17114851/mongo-id-field-duplicate-key-error/17115770#17115770 - to bardzo podobny (i prawdopodobnie ten sam) problem. – WiredPrairie

Odpowiedz

10

Właśnie miałem ten problem też. Chciałem, aby wartość była zerowa lub unikalna. Więc mogę ustawić zarówno unique i sparse flagi:

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

I, zrobiłem pewien, że baza faktycznie utworzony indeks poprawnie db.users.getIndexes();

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

(tak, to jest nie tak samo jak w przypadku tutaj: mongo _id field duplicate key error)

Mój błąd polegał na ustawieniu wartości default na null. W pewnym sensie, Mongoose liczy jednoznaczne null jako wartość, która musi być unikalna. Jeśli pole nigdy nie jest zdefiniowane (lub undefined), to nie jest wymuszane, aby było unikalne.

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

Tak więc, jeśli masz ten problem też, upewnij się, że nie jesteś ustawienie domyślne wartości i upewnij się, że nie ustawiamy wartości do null nigdzie indziej w kodzie albo. Zamiast tego, jeśli chcesz ustawić ją jawnie, ustaw ją na undefined (lub unikalną wartość).

Powiązane problemy