2016-06-23 25 views
5

Mam następujący schemat JSON w MongoDB:Jak mogę określić unikalność na wielu polach w mongo, NIE połączone?

{"email": "[email protected]", "second_email": "[email protected]"} 

Jak mogę wyegzekwować że oba pola będzie unikalny oddzielnie, a także być unikalna między nimi.

tj poniższym dokumencie nie będzie ważna:

{"email":"[email protected]", "second_email":"[email protected]"} 

Ponieważ [email protected] jest już w innym dokumencie w innej dziedzinie.

Odpowiedz

5

Poza tym żadna baza danych nie może tego zrobić (użyj innej kolumny/pola jako danych źródłowych dla ograniczenia unikalności). Aby to osiągnąć, musisz zmienić kształt danych. Najprostszym sposobem jest unikalne ograniczenie na polu tablicy.

> db.foo.createIndex({ emails: 1 }, { unique: true }) 

> db.foo.insert({ emails: ['[email protected]', '[email protected]'] }) 
WriteResult({ "nInserted" : 1 }) 
> db.foo.insert({ emails: ['[email protected]', '[email protected]'] }) 
WriteResult({ 
    "nInserted" : 0, 
    "writeError" : { 
     "code" : 11000, 
     "errmsg" : "E11000 duplicate key error index: test.foo.$emails_1 dup key: { : \"[email protected]\" }" 
    } 
}) 

Teraz, w zależności od logiki aplikacji, ta tablica wiadomości może nawet zastąpić pierwotne dwa pola. Albo nie. Zależy od Ciebie. Jeśli nie, będziesz musiał wstawić oba oryginalne pola i powiel je w tej tablicy, aby sprawdzić unikalność.

+1

Btw powinieneś używać 'createIndex' zamiast' ensureIndex' – styvane

+1

@ user3100115: oh, nowy api? W której wersji została wprowadzona? :) –

+1

Cóż 'sureIndex' jest nieaktualne w wersji 3.0. – styvane

1

Musisz utworzyć numer unique index w każdym polu, aby wymusić unikalność pól.

db.collection.createIndex({ "email": 1 }, { "unique": true }) 
db.collection.createIndex({ "second_email": 1 }, { "unique": true }) 

Mając na uwadze, MongoDB nie zapewnia sposobu na wymóg jednoznaczności dla dwóch pól w tych samych dokumentach. To jest coś, co musisz zrobić w aplikacji, używając instrukcji if/else.

Inną opcją, jak pokazano w tym answer here jest użycie tablicy pole indeksowane jeśli nie chcą wywołać createIndex() metody wielokrotnie. Ale nadal potrzebujesz logicznego przetwarzania warunku, jeśli nie chcesz duplikować wartości w tablicy.

+2

Z tablicą indeksowaną nie potrzebujesz indywidualnych indeksów pól. –

+0

@SergioTulentsev Nie mogłem się zgodzić. – styvane