我正在使用一个名为Keystone的基于Node的CMS系统,它使用MongoDB作为数据存储,因此对数据和访问具有相当自由的控制权。我有一个非常复杂的模型叫做“Family”,它有大约250个字段、一堆关系和十几个方法。我的网站上有一个表单,允许用户输入必要的信息来创建一个新的“Family”记录,但是处理时间很长(本地主机上为12秒,在我的Heroku实例上超过30秒)。我遇到的问题是Heroku会对运行超过30秒的任何进程发出应用程序错误,这意味着我需要优化我的查询。所有处理都非常快,除了一个函数。以下是造成问题的函数:
const Family = keystone.list( 'Family' );
exports.getNextRegistrationNumber = ( req, res, done ) => {
console.time('get registration number');
const locals = res.locals;
Family.model.find()
.select( 'registrationNumber' )
.exec()
.then( families => {
// get an array of registration numbers
const registrationNumbers = families.map( family => family.get( 'registrationNumber' ) );
// get the largest registration number
locals.newRegistrationNumber = Math.max( ...registrationNumbers ) + 1;
console.timeEnd('get registration number');
done();
}, err => {
console.timeEnd('get registration number');
console.log( 'error setting registration number' );
console.log( err );
done();
});
};
我的.then()
中的处理只需几毫秒,但是Family.model.find()
执行起来太慢了。有什么建议可以加快速度将不胜感激。查询正在尝试浏览大约40,000个家庭记录,并且registrationNumber
字段上已经存在索引。