EDIT
since you asked for a code example... I'm using typescript with this library ts-mongoose-pagination
to manage the pagination stuff over the card schema, btw I'm using Nestjs
card.sceham.ts
import { Schema, Types } from 'mongoose';
import { CardTypesEnum } from '../utils/constants';
import { mongoosePagination } from "ts-mongoose-pagination";
const CardSchema = new Schema({
isOriginal: Boolean,
parentCard: {type: Types.ObjectId, ref: 'Card'},
patientId: String,
coverImage: String,
title: String,
content: String,
createdBy: String,
tags: [String],
type: {
type: String,
default: CardTypesEnum.NORMAL,
enum: Object.values(CardTypesEnum),
},
}, {
timestamps: true,
});
CardSchema.plugin(mongoosePagination);
export {CardSchema};
app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { CardService } from './card.service';
import { ScheduleModule } from '@nestjs/schedule';
import { MongooseModule } from '@nestjs/mongoose';
import { CardSchema } from './schemas/card.shcema';
import * as config from 'config';
const {DB_HOST} = config.get('DB');
@Module({
imports: [
MongooseModule.forRoot(process.env.DB || DB_HOST, {
useNewUrlParser: true,
useUnifiedTopology: true,
}),
MongooseModule.forFeature([
{
name: 'Card',
schema: CardSchema,
}
]),
ScheduleModule.forRoot()],
controllers: [AppController],
providers: [CardService],
})
export class AppModule {}
card.service.ts
import { Injectable, Logger } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { IPaginateResult, Model, PaginateModel } from 'mongoose';
import { CardsListFilterDto, CardDto } from './utils/dto/Cards.dto';
import { QueryOptionsDto } from './utils/dto/db.dto';
@Injectable()
export class CardService {
private readonly logger = new Logger(CardService.name);
constructor(
// cardModel type is not Model but PaginateModel (so you can use the paginate method)
@InjectModel('Card') private readonly cardModel: PaginateModel<any>,
) {}
async getCardLists(cardsListFilterDto: CardsListFilterDto): Promise<IPaginateResult<any>> {
const optionsDto: QueryOptionsDto = {
page: parseInt(cardsListFilterDto.page),
perPage: parseInt(cardsListFilterDto.perPage),
sort: {'_id': -1}
};
const where = {
createdBy: cardsListFilterDto.createdBy,
isOriginal: true,
};
// you can have paginate method by adding the plugin to schema
return await this.cardModel.paginate(where, optionsDto)
}
}
Hope this resolve your issue