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