2013-07-09 19 views
6

Gdy próbuje wprowadzić nowy dokument w Mongo o wartości na polu, które już istnieją w innym dokumencie uzyskać to kiedy iterację obiektu błędzie:Mongodb duplikat błędu klucza. Jak uzyskać pole błędu z obiektu błędu jako obiektu?

for(var att in err){ 
    console.log(att+": "+err[att]); 
} 

nazwa: MongoError err: E11000 duplikat klucza wskaźnik błędu. draw.users $ EMAIL_1 klucz dup: { "[email protected]"} Kod : 11000 n: 0 ok: 1

Więc to mówi mi, co chcę wiedzieć, problem jest polem e-mail. Ale czy mogę otrzymać nieprawidłowe pole jako klucz/wartość, a nie tylko ciąg?

+0

Z konsoli? – WiredPrairie

Odpowiedz

0

Jeśli zderzy się, wykonanie funkcji find() dla tego zapytania spowoduje zwrócenie obiektów kolizji i przejście z tego miejsca.

+0

Użytkownik chciałby tylko znaleźć znalezione na indeksowanych polach, które były unikalne. Wymagałoby to potencjalnego przeszukiwania wielu pól. – WiredPrairie

+0

Dziękuję wam. Zgaduję, że spróbuję znaleźćOne, zanim zrobię save. Pomyślałem, że mogę uciec, używając komunikatu mongoError. I myślę, że to powinno być możliwe w jakiś sposób? Wiadomość mówi mi, co chcę, ale jako ciąg, byłoby to niechlujne, aby zrobić wyrażeń regularnych na chyba. – oivind

+0

@oindind Wciąż istnieje szansa, że ​​aktualizacja zakończy się niepowodzeniem, ponieważ można zapisać inny dokument między wywołaniem 'findOne' a wstawieniem/aktualizacją. – WiredPrairie

3

Używam wyrażenia regularnego. Podobny do tego:

if(err){ 
    field = err.err.match(/\$(.*?)_/)[1] 
} 

Co jest całkowicie hacky, ale działa dla mnie.

+0

Nie działa w takich indeksach złożonych: '$ client_1_email_1' –

0

Komunikat o błędzie nie daje informacje, że szukasz:

nazwa: MongoError Err: E11000 duplikat klucza indeksu błędzie. Draw.users $ EMAIL_1 klucz DUP: {: „spam @ online.no "} kod: 11000 n: 0 ok: 1

Ale daje wystarczająco dużo, aby je odzyskać.

Musisz dostać indeks, który jest przyczyną problemu: "EMAIL_1" (użyć wyrażenia regularnego)

to trzeba zapytać db o tym indeksie:

draw.users.getIndexKey ("EMAIL_1")

0

Korzystanie z podziałem na komunikat o błędzie zwracane pracę dla mnie w ten sposób

var x= err.errmsg.split("index:")[1].split("dup key")[0].split("_")[0]; 
Powiązane problemy