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发出批量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
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();