NodeJS, MongoDB, mocno spowalnia podczas findOneAndUpdate ok 13k rekordów

0

Witam,
tworzę aplikację backend nodejs, baza danych mongodb, front react. Wszystko raczej dobrze działa, system logowania, rejestracji, pobieranie z bazy danych, ale podczas aktualizacji dokumentów w bazie danych, dokładnie chodzi o kolekcję ok 13 tys dokumentów z nazwą i ceną, co jakiś czas planuję aktualizację tej kolekcji za pomocą API. Zrobiłem tak, że najpierw przez API wyciągam to co potrzebuję i tworzę tablicę z tymi danymi, potem przy pomocy findOneAndUpdate przeszukuję daną kolekcję i jeśli dokument się znajduję to aktualizuję cenę, a jeśli nie to dodaję nowy. Nie wiem czy w ogóle dobrze to robię, bo jak tylko uruchomię te funkcję to nic innego w ciągu tych kilkunastu sekund nie mogę zrobić na stronie, logowanie zawiesza się, pobieranie z bazy danych też, strona wisi do poki proces aktualizacji nie zostanie zakonczony. Proszę o pomoc, jak uniknąć takiego konfliktu, z góry dziękuję i pozdrawiam

module.exports = getAllItemPrices = async () => {
  try {
    const key = process.env.BITSKINS_KEY;
    const secret = process.env.BITSKINS_SECRET;
    const code = totp.gen(base32.decode(secret));
    // const items = {};


    const response = await axios.post(
      `https://bitskins.com/api/v1/get_all_item_prices/?api_key=${key}&app_id=730&code=${code}`
    );

    const allowed = [
      "app_id",
      "market_hash_name",
      "price",
      "pricing_mode",
      "skewness",
      "icon_url",
      "quality_color"
    ];
    const prices = await response.data.prices;

    //
    // Filtrujemy obiekty, aby zawierały tylko to co w zmiennej allowed
    //
    const items = await prices.map(item => {
      // console.log(item);
      return (item = filtered = allowed.reduce(
        (obj, key) => ({ ...obj, [key]: item[key] }),
        {}
      ));
    });

    await items.map(item => {
      const { market_hash_name, price } = item;
      // console.log(item.market_hash_name);
      const options = { upsert: true, setDefaultsOnInsert: true };
      ItemPrice.findOneAndUpdate(
        { price: price },
        { price: price },
        options,
        (err, item) => {
          if (err) {
            console.log(err);
          } else {
            // item.save();
          }
        }
      );
    });
    return items;
  } catch (err) {
    console.log(err);
  }
};

0
  1. Doczytaj trochę o async/await i Promise
  2. Czy to na pewno ma sens ?
ItemPrice.findOneAndUpdate(
       { price: price }, //<---- może tu powinno być {name:   market_hash_name}
       { price: price }, //<----
       options,
1

Witam,

  1. Tak, zdecydowanie doczytuję teraz async/await, gdzieś tutaj jest pewnie problem i porozbijam też na 2-3 funkcje ten cały kod.
  2. Jak ogarnę pkt 1 to spróbuję z name: market_hash_name, bo teraz nie robi to różnicy.
    Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1