2015-09-28 10 views
6

Jak mogę wykonać wkładkę zbiorczą i kontynuować w przypadku wystąpienia błędu duplikatu klucza?Unikaj wielokrotnego wstawiania duplikatu klucza kluczowego

Mam kolekcję z unikatowego indeksu na polu (nie_id) id i niektórych danych w nim. Następnie otrzymuję więcej danych i chcę dodać do kolekcji tylko nieaktualne dokumenty.

Mam następujący kod:

let opts = { 
    continueOnError: true, // Neither 
    ContinueOnError: true, // of 
    keepGoing: true,  // this 
    KeepGoing: true,  // works 
}; 
let bulk = collection.initializeUnorderedBulkOp(opts); 
bulk.insert(d1); 
bulk.insert(d2); 
bulk.insert(d3); 
... 
bulk.insert(dN); 
let result = yield bulk.execute(opts); // this keep throwing duplicate key error 

A ja tylko chcą ignorować błędy i niech luzem wykończenie ze wszystkimi kolejce operacji.

Szukałem w npm module api iw aplecie MongoDB dla Bulk, initializeUnorderedBulkOp oraz dokumentów dla Bulk write bez powodzenia.


Również w docs dla operacji nieuporządkowane one say:

Error Handling

W przypadku wystąpienia błędu podczas przetwarzania jednej z operacji zapisu, MongoDB będzie nadal proces pozostałe operacje zapisu na liście.

Wich nie jest prawdziwe (przynajmniej w moim przypadku) :(

Wszelkie pomysły są mile widziane!

+0

To jest mylące i sprawa błąd rzeczywiście zmieniła się w ostatnich wydaniach, jak wcześniej obiekt 'UnOrderdedBukOp' konstrukt nigdy nie produkują błąd, który„thows”, ale tylko produkować "lista błędów" w odpowiedzi. Nie pierwszy na to narzeka. Ogólną radą jest "zignorowanie" błędu i samodzielne sprawdzenie obiektu wyniku, ponieważ wynik ** zawsze ** będzie kontynuowany do końca partii. Więc nie masz racji, ponieważ faktycznie ** zrobił ** wypisał wszystkie operacje na liście (działało), ale po prostu rzucił błąd, kiedy myślę, że nie powinien. –

+0

Dziękuję za wyjaśnienia, ale moim problemem jest to, że metoda "wykonuj", używając obietnic, podnosi wyjątek i obietnica zostanie odrzucona tylko z błędem; utratę obiektu 'BulkWriteResult'. – Volox

+0

Tak. To jest dokładnie moja odpowiedź. Wcześniejsze sterowniki nie podniosły w tym przypadku wyjątku, a teraz to robią. Nie ma to jednak wpływu na przetwarzanie operacji "UnOrdered". Partia jest "nadal" wykonywana jako całość, jednak zamiast zwracać "błędy" w obiekcie odpowiedzi wynik "wyrzuca" i błąd, co najmniej jeden błąd występujący podczas wykonywania. Teraz rozumiem? –

Odpowiedz

Powiązane problemy