У меня проблема, относящаяся к rxJS
и массовым HTTP-запросам из огромной коллекции (1M + документы)
У меня есть следующий код с довольно простой логикой.Я помещаю все документы из коллекции в массив allplayers
и выполняю массовые 20 HTTP
запросов к API сразу (думаю, вы понимаете, почему он ограничен). Итак, код работает нормально, но, думаю, пришло время изменить его с этого:
const cursor = players_db.find(query).lean().cursor();
cursor.on('data', function(player) { allPlayers.push(player); });
cursor.on('end', function() {
logger.log('warng',`S,${allPlayers.length}`);
from(allPlayers).pipe(
mergeMap(player => getPlayer(player.name, player.realm),20),
).subscribe({
next: player => console.log(`${player.name}@${player.realm}`),
error: error => console.error(error),
complete: () => console.timeEnd(`${updatePlayer.name}`),
});
});
На данный момент я использую find
с cursor
с (batchSize
), но если я правильно понял (через .length
), и в соответствии с этим вопросом: { курсор мангусты batchSize } batchSize
- это просто способ оптимизации, и он не возвращает мне массив X документов.
Так что мне теперь делать и какой оператор выбрать для rxJS
?
Например, я мог бы сформировать массивы необходимой длины (например, 20) и перенестиэто к rxJS
, как я использую это раньше.Но я думаю, что должен быть другой способ, где я мог бы использовать rxJS
внутри этого for promise loop
const players = await players_db.find(query).lean().cursor({batchSize: 10});
for (let player = await players.next(); player != null; player = await players.next()) {
//do something via RxJS inside for loop
}
Также я нашел этот вопрос { Лучший способ запросить все документы из коллекции mongodb вРеактивный способ без заполняющей RAM }, который также имеет отношение к моей проблеме, и я понимаю логику, но не синтаксис этого.Я также знаю, что переменная cursor
не является документом. Я ничего не могу сделать полезной с ней.Или на самом деле я мог бы?
- rxJS
bufferCount
- довольно интересный оператор - https://gist.github.com/wellcaffeinated/f908094998edf54dc5840c8c3ad734d3 вероятное решение?