【问题标题】:Run Mongo find Synchronously同步运行 Mongo 查找
【发布时间】:2020-05-05 21:36:46
【问题描述】:

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

诀窍是我需要对匹配执行一些逻辑,然后重新更新 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 中的当前元素(所以寻找迭代器)..那样我可以处理它。

【问题讨论】:

  • 尝试使用异步等待获取结果,然后将其推送到 jsonToCSV 数组。
  • 请提供一个例子。我看到在很多帖子中使用 asyn await ,但它似乎不起作用。我认为这是由于for

标签: javascript json mongodb csv papaparse


【解决方案1】:

您可以尝试 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 以更好地理解。

【讨论】:

  • 这行得通,虽然看起来我应该只在 for 循环中使用 IN bc find 仍然不推荐并且仍然很慢。请您简要解释一下代码到底在做什么。
  • @user2402616 确实是一个通过数组的低效解决方案循环,并使用“查找”方法为每行 CSV 搜索项目。我不太了解您需要做什么,但似乎您需要在集合中搜索某些项目,然后使用新字段更新 CSV。是对的吗?我确实用 cmets 编辑了我的答案以解释一些代码。
  • 是的,这基本上就是我想要做的。如果我能以某种方式使用 IN 更新我的 JSON,那就太好了 - 但我不明白这是怎么可能的
  • @user2402616 我真的认为你想要做什么是完全不可能的。也许您应该在解析 CSV 时使用 step 函数。在文档link 上查看此选项
  • 好的,正如我所说,在集合查询中使用 IN 是不可能的,因为正如您在第一个问题中所说,您无法将查询结果的每个元素与 CSV 中的确切行匹配. CSV 中的数据必须通过唯一键与集合中的文档相关联,以便您可以修改 CSV 中的正确行
猜你喜欢
  • 1970-01-01
  • 2013-06-15
  • 2018-08-12
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2012-11-25
相关资源
最近更新 更多