我正在处理一个脚本,在该脚本中,我需要从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也不会造成任何停机。
答案 0 :(得分:0)
我不知道MongoDB,但是您的诺言代码存在一些问题:
Promise.map
还是then
)来说,它都能够等待异步回调的结果,该回调必须return
一个等待等待的诺言
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);
});
}