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} - номер предыдущей страницы, если имеется, или NULL
  • nextPage {Number} - номер следующей страницы, если имеется, или NULL
  • pagingCounter {Число} - Стартовый сл. номер первого документа.

Обратите внимание, что указанные выше свойства можно переименовать, установив атрибут 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);
	};