NodeJS MongoDB разбиение на страницы для агрегатных функций.
Библиотека настраиваемой совокупной разбивки на страницы на основе курсора для Mongoose с настраиваемыми метками.
Если вы ищете базовую библиотеку разбивки на страницы без агрегирования, используйте эту mongoose-paginate-v2
Установка
npm install mongoose-aggregate-paginate-v2
использование
Добавление плагина в схему,
var mongoose = require('mongoose');
var aggregatePaginate = require('mongoose-aggregate-paginate-v2');
var mySchema = new mongoose.Schema({
/* your schema definition */
});
mySchema.plugin(aggregatePaginate);
var myModel = mongoose.model('SampleModel', mySchema);
а затем используйте метод модели aggregatePaginate,
// as Promise
var myModel = require('/models/samplemodel');
const options = {
page: 1,
limit: 10
};
var myAggregate = myModel.aggregate();
myModel.aggregatePaginate(myAggregate, options).then(function(results){
console.log(results);
}).catch(function(err){
console.log(err);
})
// as Callback
var myModel = require('/models/samplemodel');
const options = {
page: 1,
limit: 10
};
var myAggregate = myModel.aggregate();
myModel.aggregatePaginate(myAggregate, options, function(err, results) {
if(err) {
console.err(err);
else {
console.log(results);
}
})
Model.aggregatePaginate ([aggregateQuery], [параметры], [обратный вызов])
Обещание возврата
Параметры
[aggregate-query]{Объект} - совокупные критерии запроса. "Документация"[options]{Object}[sort]{Объект | String} - Порядок сортировки. "Документация"[page=1]{Число} - Текущая страница.[limit=10]{Number} - Документы. на страницу.[customLabels]{Object} - Разработчики могут предоставить пользовательские метки для управления данными ответа.[allowDiskUse]{Bool} - для включения diskUse для больших запросов. (по умолчанию = false)[callback(err, result)]- (Необязательно) Если указано, обратный вызов вызывается после получения результатов разбиения на страницы или при возникновении ошибки.
Возвращаемое значение
Обещание выполнено с объектом, имеющим свойства:
docs{Array} - массив документовtotalDocs{Число} - общее количество документов, соответствующих запросу.limit{Number} - использованный лимитpage{Number} - номер текущей страницыtotalPages{Число} - общее количество страниц.hasPrevPage{Bool} - наличие предыдущей страницы.hasNextPage{Bool} - Доступность следующей страницы.prevPage{Number} - номер предыдущей страницы, если имеется, или NULLnextPage{Number} - номер следующей страницы, если имеется, или NULLpagingCounter{Число} - Стартовый сл. номер первого документа.
Обратите внимание, что указанные выше свойства можно переименовать, установив атрибут customLabel.
Пример использования
Вернуть первые 10 документов из 100
const options = {
page: 1,
limit: 10
};
// Define your aggregate.
var aggregate = Model.aggregate();
Model.aggregatePaginate(aggregate, options)
.then(function(result) {
// result.docs
// result.totalDocs = 100
// result.limit = 10
// result.page = 1
// result.totalPages = 10
// result.hasNextPage = true
// result.nextPage = 2
// result.hasPrevPage = false
// result.prevPage = null
})
.catch(function(err){
console.log(err);
});
С индивидуальными этикетками возврата
Теперь разработчики могут при желании указать имена возвращаемых полей. Ниже приведен список атрибутов, название которых можно изменить.
- totalDocs
- документы
- предел
- страница
- следущая страница
- предыдущая страница
- totalPages
- hasNextPage
- hasPrevPage
- pagingCounter
Вы должны передать имена свойств, которые хотите изменить, используя объект customLabels в параметрах. Ярлыки являются необязательными, вы можете передавать ярлыки тех ключей, которые вы меняете, другие будут использовать ярлыки по умолчанию.
Тот же запрос с персонализированными ярлыками
const myCustomLabels = {
totalDocs: 'itemCount',
docs: 'itemsList',
limit: 'perPage',
page: 'currentPage',
nextPage: 'next',
prevPage: 'prev',
totalPages: 'pageCount',
hasPrevPage: 'hasPrev',
hasNextPage: 'hasNext',
pagingCounter: 'pageCounter'
};
const options = {
page: 1,
limit: 10,
customLabels: myCustomLabels
};
// Define your aggregate.
var aggregate = Model.aggregate();
Model.aggregatePaginate(aggregate, options, function(err, result) {
if(!err) {
// result.itemsList [here docs become itemsList]
// result.itemCount = 100 [here totalDocs becomes itemCount]
// result.perPage = 10 [here limit becomes perPage]
// result.currentPage = 1 [here page becomes currentPage]
// result.pageCount = 10 [here totalPages becomes pageCount]
// result.next = 2 [here nextPage becomes next]
// result.prev = null [here prevPage becomes prev]
// result.hasNextPage = true [not changeable]
// result.hasPrevPage = false [not changeable]
} else {
console.log(err);
};