同步运行Mongo查找

问题描述 投票:0回答:1

我在一个csv文件中有20 + k行的问题,我试图根据包含350k文档的Mongo DB中匹配字段的文档来更新它们。

诀窍是我需要对比赛执行一些逻辑,然后重新更新csv。

我正在使用PapaParse解析/取消解析csv文件

做类似的事情来获得我所有的比赛

const file = fs.createReadStream('INFO.csv');
Papa.parse(file, {
    header: true,
    complete: function(row) {        
        getMatchesAndSave(row.data.map(el => { return el.fieldToMatchOn })); 
    }
});`

function getMatchesAndSave(fields) {
Order.find({fieldToMatchOn: { $in: fields}}, (err, results) => {
    if (err) return console.error(err);
    console.log(results);
});

}

那使我比赛很快。但是,我无法真正将数据合并回csv bc,csv具有Mongo不知道的唯一键列。

所以所有数据实际上都取决于csv中的内容。

因此我想到了做这样的事情

`

const jsonToCSV = [];
for (let row of csvRows) {
    db.Collection.find({fieldToMatchOn: row.fieldToMatchOn}, (err, result) => {
        //Add extra data to row based on result
        row.foo = result.foo;

        //push to final output
        jsonToCSV.push(row);
    }
}
papa.unparse(jsonToCSV);
//save csv to file

上述实现的问题(可能看起来效率很低)-是Find调用是异步的,没有东西被推送到jsonToCSV。

任何提示?用$ in解决此问题将是理想的,是否有任何方法可以访问$ in中的当前元素(因此寻找迭代器)..那样我可以对其进行处理。

javascript json mongodb csv papaparse
1个回答
0
投票

您可以尝试异步/等待来迭代csvRows数组,如下所示:

const search = async () => {
  const jsonToCSV = await Promise.all(csvRows.map(async row => {
    try {
      const result = await db.Collection.find({ fieldToMatchOn: row.fieldToMatchOn });
      row.foo = result.foo;
    } catch (e) {
      // do somenthing if error
    }
  }));
  papa.unparse(jsonToCSV);
}

// call search function
search();

© www.soinside.com 2019 - 2024. All rights reserved.