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!
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. –
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
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? –