Javascript Mongoose游标:来自集合的http批量请求
我遇到了一个与Javascript Mongoose游标:来自集合的http批量请求,javascript,mongodb,mongoose,async-await,rxjs,Javascript,Mongodb,Mongoose,Async Await,Rxjs,我遇到了一个与rxJS和来自庞大集合(超过1M个文档)的批量HTTP请求相关的问题 我有以下代码,逻辑非常简单。我将集合中的所有文档推送到allplayersarray,并立即向API发出批量20HTTP请求(我想您理解它的局限性),因此,代码工作正常,但我想是时候从以下方面对其进行重构: const cursor = players_db.find(query).lean().cursor(); cursor.on('data', function(player
rxJS
和来自庞大集合(超过1M个文档)的批量HTTP请求相关的问题
我有以下代码,逻辑非常简单。我将集合中的所有文档推送到allplayers
array,并立即向API发出批量20HTTP
请求(我想您理解它的局限性),因此,代码工作正常,但我想是时候从以下方面对其进行重构:
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
只是一种优化方法,它不会返回X文档数组
那么,我现在应该做什么?我应该为rxJS
选择什么操作符
例如,我可以形成具有必要长度(如20)的数组,并像以前一样将其传输到rxJS
。但我想应该有另一种方法,在这个for promise循环中使用rxJS
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
}
我还发现这个问题{}也与我的问题有关,我理解逻辑,但不理解它的语法。我还知道cursor
变量不是一个文档,我不能用它做任何有用的事情。或者事实上我可以
rxJS的bufferCount
是一个非常有趣的操作符
可能的解决方案李>
因此,最终我发现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();
因此,最终我发现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();