目前透過 mongoose 查詢 pagination 資料覺得很麻煩,
先取得 total count 再取 page data,
目前使用的方式如下:
user
.find(where)
.count()
.then((totalCount) => {
if (totalCount && totalCount > 0) {
return user.find(where)
.select('field1 field2 field3 filed4')
.sort({ createdOn: -1 })
.skip(skip)
.limit(limit)
.exec()
.then((rows) => {
return {
rows:rows
totalCount: totalCount
});
} else {
return res.status(200)
.json({
rows: [],
skip: skip,
limit: limit,
totalCount: 0
})
.end();
}
})
.then((result) => {
return res.status(200)
.json({
rows: result.rows,
skip: skip,
limit: limit,
totalCount: result.totalCount
})
.end();
})
.catch((err) => {
next(err);
});
寫得落落長,太麻煩了,花了一些時間查查,有沒有什麼方便的方式
原來 mongoose 有 pagination plugin 可以用,真的是佛心來的,
使用方式如下:
Installation:
npm install mongoose-paginate
Usage:
var mongoose = require('mongoose');
var mongoosePaginate = require('mongoose-paginate');
var schema = new mongoose.Schema({ /* schema definition */ });
schema.plugin(mongoosePaginate);
var Model = mongoose.model('Model', schema); // Model.paginate()
Model.paginate([query], [options], [callback])
所以上面的範例可以改成:
var where = {};
var options = {
select: 'field1 field2 field3 filed4',
sort: { createdOn: -1 },
lean: true,
offset: 20,
limit: 10
};
user.paginate(where, options).then(function(result) {
return res.status(200)
.json({
rows: result.docs,
skip: skip,
limit: limit,
totalCount: result.total
})
.end()
});
太好了,是不是簡單很多!
reference:https://www.npmjs.com/package/mongoose-paginate