我需要从mongodb获取1000条记录,如何在节点js中执行此操作? 我已经尝试通过将限制发送到1000来使用分页甚至认为返回响应需要25秒,那么还有其他方法可以最小化响应时间吗?
exports.getAll = function(filters, sort, skip, limit, callback) {
let query = {
removed: false
};
let filter = {};
let options = {
sort: []
};
req.skip = 0;
options.limit = 10000
options.sort = [
['_id', 'desc']
];
collections.findItems(query, filter, options, (err, result) => {
if (err) {
logger.error('db error', err);
return callback('Something went wrong');
}
callback(null,result);
});
};
exports.getAll = function getAll(req, res, next) {
service.getAll(req.body.filters, req.body.sort, req.body.skip, req.body.limit, (err, data) => {
if (err) {
return next({
status: 400,
error: err
});
}
res.json(data);
});
};
答案 0 :(得分:1)
我猜您在find
方法中使用了mongoose findItems
。 find()
返回包含大量内容的mongoose文档。
您可以使用find().lean()
。
使用lean()
,将返回来自mongodb的简单普通javascript对象数据。它会大大优化响应时间。
但我也建议您阅读此内容,以便在mongodb级别进行更多查询优化:https://docs.mongodb.com/manual/core/query-optimization/
答案 1 :(得分:0)
您使用的是ORM吗?像sequelize?
你的文件结构是什么?
检查您的mongdb日志:
tail -f /var/log/mongodb/mongod.log
如果您的文档是直接的,那么您应该使用索引。
如果您有索引,请尝试重建它们。
应用索引时,排序有效。如果可以,请避免在服务器上排序,在客户端排序数据。
因为数据库对排序操作施加了32MB的内存限制