蓝鸟承诺并发Mongo数据库集合迁移操作

时间:2019-03-04 08:19:49

标签: node.js mongodb promise bluebird

我正在处理一个脚本,在该脚本中,我需要从mongodb集合中获取数据,使用一些重命名和映射对其进行处理,然后将数据放入其他集合中。我在带有mongodb本地客户端的nodejs的expressjs中使用此脚本。

这是我的脚本,具有所有正在运行的功能

const syncCustomerWithCustomerv1 = function(params){
    utils.connectDB().then((client) => {
        Promise.map(aggregateDocumentsv1(client, params), function(cursor){
            Promise.map(getCustomerDatav1(cursor), function(customer){

                var hashedMap = makeHashedObjectv1(customer);
                makeDatav1(client, customer, hashedMap).then((response)=> {
                    console.log("success");
                }).catch((error) => {
                    console.log(error);
                    reject(error);
                })
            }, {concurrency: 500});
        }, {concurrency: 500}).then((reponse) => {  
            console.log("data inserted");
        })
    }).catch((error) => {
        console.log(error);
    });
}

现在,在名为syncCustomerWithCustomerv1的函数中,我能够将数据从旧集合中获取到新集合中,但是我认为没有任何并发​​请求会被接收到。在执行上述操作时,我无法点击api,因此在运行该操作时,它将不允许其他请求继续运行。

  • 在Promise.map(aggregateDocumentsv1)中,我正在获取游标列表。 listOfCursor数组中的每个元素都有一个游标,当查询该游标时会产生500条记录。

  • 我希望它获取每个游标并将其分配给下一个Promise.map(getCustomerDatav1(cursor)),现在这将产生我以前的mongo集合中拥有的每个客户,并且我们可以在我们得到的对象,然后将数据插入到新集合中。

如果有人遇到问题,并且知道如何更好地进行并发操作,以便我可以运行此脚本,而且我的API也不会造成任何停机。

1 个答案:

答案 0 :(得分:0)

我不知道MongoDB,但是您的诺言代码存在一些问题:

  • 对于任何函数(无论是Promise.map还是then)来说,它都能够等待异步回调的结果,该回调必须return一个等待等待的诺言
  • 您正在执行500个并发操作,其中每个操作都执行500个并发操作。总的并发系数为250000!您可能想减少一点。

function syncCustomerWithCustomerv1(params){
    utils.connectDB().then(client => {
        return Promise.map(aggregateDocumentsv1(client, params), cursor => {
//      ^^^^^^
            return Promise.map(getCustomerDatav1(cursor), customer => {
//          ^^^^^^
                var hashedMap = makeHashedObjectv1(customer);
                return makeDatav1(client, customer, hashedMap).then(response => {
//              ^^^^^^
                    console.log("success");
                }, error => {
                    console.log(error);
                });
            }, {concurrency: 500});
        }, {concurrency: 500})
    }).then(reponse => {  
        console.log("data inserted");
    }, error => {
        console.log(error);
    });
}