我在一个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中的当前元素(因此寻找迭代器)..那样我可以对其进行处理。
您可以尝试异步/等待来迭代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();