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); };