猫鼬光标和rxJS;来自集合的http批量请求

时间:2019-06-25 11:07:31

标签: javascript mongodb mongoose async-await rxjs

我遇到一个与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 } 变量不是文档,我无法对它做任何有用的的操作。或者实际上我可以?

  
      
  1. rxJS的cursor是一个非常有趣的运算符
  2.   
  3. https://gist.github.com/wellcaffeinated/f908094998edf54dc5840c8c3ad734d3可能的解决方案?
  4.   

1 个答案:

答案 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();