运行 Mongo 同步查找
Run Mongo find Synchronously
我有一个问题,我在一个 csv 文件中有 20+k 行,我正在尝试根据包含 350k 文档的 Mongo 数据库中匹配字段的文档更新它们。
诀窍是我需要对匹配项执行一些逻辑,然后重新更新 csv。
我正在使用 PapaParse parse/unparse 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,因为 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 中的当前元素(因此寻找迭代器)..这样我就可以处理它。
您可以尝试 async/await 迭代 csvRows 数组,如下所示:
const search = async () => {
const jsonToCSV = await Promise.all(csvRows.map(async row => {
/* find returns a promise, so we can use await, but to use await is
mandatory use it inside an async function. Map function not returns a
promise, so this can be solve using Promise.all. */
try {
const result = await db.Collection.find({ fieldToMatchOn: row.fieldToMatchOn });
row.foo = result.foo;
return row;
} catch (e) {
// do somenthing if error
}
}));
papa.unparse(jsonToCSV);
}
// call search function
search();
检查此 https://flaviocopes.com/javascript-async-await-array-map 以更好地理解。
我有一个问题,我在一个 csv 文件中有 20+k 行,我正在尝试根据包含 350k 文档的 Mongo 数据库中匹配字段的文档更新它们。
诀窍是我需要对匹配项执行一些逻辑,然后重新更新 csv。
我正在使用 PapaParse parse/unparse 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,因为 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 中的当前元素(因此寻找迭代器)..这样我就可以处理它。
您可以尝试 async/await 迭代 csvRows 数组,如下所示:
const search = async () => {
const jsonToCSV = await Promise.all(csvRows.map(async row => {
/* find returns a promise, so we can use await, but to use await is
mandatory use it inside an async function. Map function not returns a
promise, so this can be solve using Promise.all. */
try {
const result = await db.Collection.find({ fieldToMatchOn: row.fieldToMatchOn });
row.foo = result.foo;
return row;
} catch (e) {
// do somenthing if error
}
}));
papa.unparse(jsonToCSV);
}
// call search function
search();
检查此 https://flaviocopes.com/javascript-async-await-array-map 以更好地理解。