改善 MongoDB Altas 中 GET 的查询时间

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

这是我的代码的快照。

exports.getTestCases = async (bucketName, startTimeStamp, endTimeStamp) => {
  let results = [];
  let startTime = parseInt(startTimeStamp);
  let endTime = parseInt(endTimeStamp);
  const maxDataLimit = 1500;
  const maxYearsBack = 10;
  const oneYearInMilliseconds = 31536000000;

  let query = {
    executiondate: { $gte: startTime, $lte: endTime } // --> 'executiondate' is indexed in DB
  };

  const projection = {'Some of my required fields'};

  const DynamicModel = getModelForCollection(bucketName);

  while (results.length < maxDataLimit) {
    console.log(`Fetching data: Start Time: ${new Date(startTime)}, End Time: ${new Date(endTime)}`);
    try {
      results = await DynamicModel.find(query, projection)
        .sort({ executiondate: -1 })
        .limit(maxDataLimit)
        .lean()
        .exec();
      console.log(`Total records fetched: ${results.length}`);
      if (results.length >= maxDataLimit) break;
    } catch (error) {
      console.error("Failed to fetch data:", error);
      throw error;
    }

    endTime -= oneYearInMilliseconds;
    query.executiondate.$gte = endTime;

    if ((startTime - endTime) > maxYearsBack * oneYearInMilliseconds) {
      break;
    }
  }

  return results.slice(0, maxDataLimit);
};

这段代码的作用是在未达到最大限制的情况下获取总共 10 年的数据。每年增加一次。问题是迭代时至少需要 7-8 秒才能获取 600 个数据。

bucketName
是 MongoDB 的集合

有什么办法可以提高抓取速度吗?也许有任何不同的方法来重写整个逻辑?我想不出

alternate
loop
这是我猜测的罪魁祸首。我已经在使用
lean()
。略有改善,但并不令人满意。 node.js 和 mongo db 的新手,所以任何建议都会有帮助。

javascript node.js mongodb performance
1个回答
0
投票

您对

executiondate
的查询每次都会对数据库进行完整扫描,然后对结果进行排序。想一想:引擎如何在不查看每个文档的情况下进行比较? 查询顺序的最佳实践是“ESR”:找到精确匹配项,然后排序,然后范围。您正在对 after 范围进行排序。 另外,如果您还没有这样做,请为
executiondate
创建索引。我希望这有帮助。

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