Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to add pagination to an API endpoint? #67

Open
yavand opened this issue Apr 15, 2020 · 2 comments
Open

How to add pagination to an API endpoint? #67

yavand opened this issue Apr 15, 2020 · 2 comments
Labels
question Further information is requested

Comments

@yavand
Copy link

yavand commented Apr 15, 2020

Hi @santiq,
How can I add pagination to mongoose models?

@santiq
Copy link
Owner

santiq commented Apr 15, 2020

Edit December 4 2020:

Here is a blog post that I wrote with detailed information about it

Pagination in nodejs with mongo

Hello!

Start by accepting (and sending) these new query parameters on your API skip and limit

limit is the page size you want, and skip is to get the page you want.

For example, you want 20 elements per page, you have to call the API like this:

First Page

axios.get(`myapi.com/api/users?limit=20&skip=0`

Second page

axios.get(`myapi.com/api/users?limit=20&skip=20`)

Just send on skip the current page number minus 1 times page size

axios.get(`myapi.com/api/users?limit=${PageSize}&skip=${ (CurrentPage-1) * PageSize }`)

Now, back on the server side

route.get('/api/users', (req, res)=> {
  const limit = parseInt(req.query.limit);
  const skip = parseInt(req.query.skip);

  MyMongooseModel.find({  }).skip(skip).limit(limit).exec()

})

@santiq santiq added the question Further information is requested label Apr 15, 2020
@santiq santiq changed the title How to Add Pagination to Models? How to add pagination to an API endpoint? Apr 15, 2020
@ijhar8
Copy link

ijhar8 commented Apr 19, 2020

i have made a helper function for pagination and search filter with sorting ....

const listData = async (doc, filter) => {

let { page = 0, limit = 10, sort = 1, sortby = `createdAt`, where = {} } = filter

const BOOLENTYPE = ['isDeleted']
/*search filters */
let search = {}
for (const cloumn in where) {
	if (where.hasOwnProperty(cloumn) && where[cloumn]) {

		if (BOOLENTYPE.includes(cloumn) && typeof where[cloumn] === Boolean)
			search[cloumn] = where[cloumn];
		else
			search[cloumn] = { '$regex': where[cloumn], '$options': 'i' }


	}
}

/*code for pagination start */
limit = parseInt(limit)
page = parseInt(page)
page = limit * (page - 1)
page = page < 1 ? 0 : page//negative values can break skip

let data = []
try {
	data = await doc.find(search)    // find all users with filter
		.skip(page)                  // skip the first n items 
		.limit(limit)                // limit to n items
		.sort({ [sortby]: sort })    // sort asc/dsc by createdAt


	let totalCount = await doc.countDocuments(search)
	let totalPages = Math.ceil(totalCount / limit)

	return {
		data: data,
		pages: totalPages,
		totalCount,
		success: true,
		errors: [],
		message: ""
	};

} catch (error) {
	// console.log(error)
	return {
		success: false,
		message: error.toString(),
		description: `error while fetching data please check data and data type`
	}
}

}
module.exports = { listData }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants