Dostaję listę obiektów z API:

let sold = [
 {  objId: 3240747,
    soldDate: '2018-09-27',
    soldPrice: 4610000,
    apartmentNumber: '1202',
    soldPriceSource: 'bid',
  },
  { objId: 3234263,
    soldDate: '2018-09-24',
    soldPrice: 2580000,
    soldPriceSource: 'bid',
  }
...
]

Przechowuję je w kolekcji:

soldCollection.insertMany(sold)

Niektóre obiekty zostały już pobrane i chcę przechowywać tylko te, których nie ma w bazie danych.

 dbo.collection("sold").createIndex({ "objId": 1 }, { unique: true })

Jaki byłby skuteczny sposób na zrobienie tego? Czy powinienem zapytać o każdy przedmiot przed przechowywaniem go, czy istnieje metoda radzenia sobie z tym?

3
Himmators 10 listopad 2018, 23:11

1 odpowiedź

Najlepsza odpowiedź

Domyślnie insertMany przestanie wstawiać po wystąpieniu pierwszego błędu (w tym przypadku E11000 duplicate key error). Możesz zmienić to zachowanie, określając parametr ordered ustawiony na false. W takim przypadku otrzymasz listę błędów z nieudanych wstawek, jednak wszystkie ważne dokumenty zostaną wstawione pomyślnie:

db.sold.insertMany(sold, { ordered: false })

Przykład dokumentów tutaj

1
mickl 10 listopad 2018, 23:32