NodeJS | MongoDB | Как мне замедлить мои вставки? - PullRequest
1 голос
/ 14 января 2020

У меня есть массив длиной 8000 элементов, и я создаю новый документ в своей базе данных MongoDB Atlas, но продолжаю превышать ограничение в 100 операций в секунду. Мне не нужны данные, чтобы попасть туда молниеносно (75 вставок в секунду меня устраивают), поэтому я попытался вставить функцию Sleep в середине функции записи, но она не работает, как я ожидал.

Что я ожидаю и хочу, чтобы мой код выполнял:

  1. написать первый документ
  2. сон в течение 20 миллисекунд
  3. напишите второй документ

Что он сейчас делает:

  1. напишите первый документ
  2. немедленно напишите Второй документ
  3. немедленно напишите третий документ

Вот пример кода:

const Sleep = ms => new Promise(res => setTimeout(res, ms));

const MyFunction = array => {
  return Promise.all(array.map(row => {
    const item = new Item({
      "property1": row.property1,
      "property2": row.property2
    });
    Sleep(20) // tried putting a sleep here but that didn't work
    return item.save();
  }));
};

1 Ответ

1 голос
/ 15 января 2020

Вам нужно дождаться вашего сна, поскольку он асин c. Но даже тогда это не сработает, так как просто задержит создание обещания, а не его выполнение.

Лучше использовать batch-promises https://www.npmjs.com/package/batch-promises

const batch = require("batch-promises");

const MyFunction = async array => {
  return batch(100, array, row => {
    const item = new Item({
      "property1": row.property1,
      "property2": row.property2
    });
    return item.save();
  });
};

ИЛИ если вы хотите сделать последовательно

const MyFunction = async array => {
  for (const row of array) {
    const item = new Item({
      "property1": row.property1,
      "property2": row.property2
    });
    await item.save();
  }
};
...