我遇到一个与rxJS
和大量集合中的大量HTTP请求(1M +文档)相关的问题
我有以下代码,逻辑很简单。我将集合中的所有文档推送到allplayers
数组中,并一次向API发出20个HTTP
批量请求(猜测您了解其局限性),因此,代码可以正常工作,但我想是时候重构它:
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
与{{1}一起使用cursor
,但是如果我理解这一权利(通过batchSize
),并据此问题:{mongoose cursor batchSize} .length
只是一种优化方式,它并没有返回我一系列的X文档。
那我现在应该怎么做,我应该为
batchSize
选择什么运营商?
例如,我可以形成具有必要长度(如20)的数组,并将其传输到rxJS
,就像我之前使用的那样。但是我想应该有另一种方法,我可以在rxJS
rxJS
for promise loop
我也发现了这个问题{Best way to query all documents from a mongodb collection in a reactive way w/out flooding RAM},它也与我的问题有关,我理解逻辑,但不了解其语法。我也知道 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
}
变量不是文档,我无法对它做任何有用的的操作。或者实际上我可以?
- rxJS的
cursor
是一个非常有趣的运算符- https://gist.github.com/wellcaffeinated/f908094998edf54dc5840c8c3ad734d3可能的解决方案?
答案 0 :(得分:0)
因此,最终我发现在这种情况下不需要rxJS(但可以使用rxJS)。
解决方案非常简单,仅使用MongoCursor
:
async function BulkRequest (bulkSize = 10) {
try {
let BulkRequest_Array = [];
const cursor = collection_db.find({}).lean().cursor({batchSize: bulkSize});
cursor.on('data', async (doc) => {
BulkRequest_Array.push(/*any function or axios instance*/)
if (BulkRequest_Array.length >= bulkSize) {
cursor.pause();
console.time(`========================`);;
await Promise.all(BulkRequest_Array);
BulkRequest_Array.length = 0;
cursor.resume();
console.timeEnd(`========================`);
}
}
} catch (e) {
console.error(e)
}
}
BulkRequest();