我正在加载一个"存档"页面,其中包括搜索mongodb集合并在页面上显示许多文档。但是,执行此操作时,服务器调用需要一段时间。有什么建议可以加快速度吗?我认为缓慢来自这条线:
Publication.find().limit(perPage).skip(perPage * page).sort('-date').exec(function (err, _publications) {
整页请求:
app.get('/archive', function (req, res) {
function timeConverter(UNIX_timestamp){
var a = new Date(UNIX_timestamp);
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var time = date + ' ' + month + ' ' + year;
return time;
}
var perPage = 6
pageParam = req.query['page']
if (pageParam == null) {
pageParam = 0
}
var page = Math.max(0, pageParam)
// find all publications
Publication.find().limit(perPage).skip(perPage * page).sort('-date').exec(function (err, _publications) {
if (err) return console.error(err)
for (id in _publications) { // convert date to text
_publications[id].date = timeConverter( Number(_publications[id].date) )
}
Publication.find().limit(perPage).skip(perPage * (page + 1) ).count({},function(err, count) { // check if it's last page
if (err) return console.error(err)
if (count == 0) {
nextPage = false
} else {
nextPage = page + 1
}
res.render(__dirname + '/../source/views/archive', {
publications: _publications,
nextPage: nextPage,
prevPage: page - 1
})
})
console.log('serving archive')
})
})
执行.limit(perPage).skip(perPage * page)
会影响您的响应时间。现在,这被认为是最好的方法,因为 mongo 将首先扫描指定集合中的所有先前文档,然后skip
它们。
更好的解决方案是获取_id
大于第一个响应中发送的所有文档。类似的东西
Publication.find({'_id': {'$gt': req.params.last_id}}, {}, { limit: perPage })
此处last_id
是最后一个文档的id
,此查询将返回该 id 之后的所有(或指定数量的)文档。
此外,mongodb 在其生成的 id 上应用索引,使用它进行搜索总是更快。
方法缓慢的主要原因是使用了skip
cursor.skip()
方法通常很昂贵,因为它要求服务器从集合或索引的开头遍历以获取偏移量或跳过位置,然后再开始返回结果。随着偏移量(例如上面的pageNumber)的增加,cursor.skip()将变得更慢,并且占用更多的CPU资源。对于较大的集合,cursor.skip() 可能会受到 IO 约束
在此处阅读更多内容
谢谢