Hello, from minute 06:42 you can see that page 1's first doc is the movie Divergent, and then when you switch to page 2 the same movie shows up. The same thing is happening to me. Because of this some movies are not shown in any of the pages. Any solution? Thank you in advance and congratulations for this course.
Ok I figured it out. Found this on the internet: "We recommend always using limit() with sort(). If you don't specify sort(), the MongoDB server doesn't guarantee you'll get the results back in any particular order." Since we were setting a default sorting by -createdAt, and that property had the same value in all docs (since they were all imported at the same time from the json file), the sorting wasn't giving any effective order to the list. Changed the default sort to '-name' and it worked perfectly.
Using pagination will break the filter method as it will modify the query at the end. Thus, in Postman, we will obtain all movie lists when filtering as defined by const limit = (entered limit is empty when filtering) || 10 .
I appreciate the explanation of the pagination. But the logic becomes wrong when filters are applied. The count returns total records, while the filter gives some of the selected records. Ex. Total records Is 20. After Filter total records are 7 While we request ratings[lte]=8&page=3&limit=5 Instead of throwing error it will return empty records.
you are the best teacher sir you explain it clearly with good example
Hello, from minute 06:42 you can see that page 1's first doc is the movie Divergent, and then when you switch to page 2 the same movie shows up. The same thing is happening to me. Because of this some movies are not shown in any of the pages. Any solution?
Thank you in advance and congratulations for this course.
Ok I figured it out. Found this on the internet:
"We recommend always using limit() with sort(). If you don't specify sort(), the MongoDB server doesn't guarantee you'll get the results back in any particular order."
Since we were setting a default sorting by -createdAt, and that property had the same value in all docs (since they were all imported at the same time from the json file), the sorting wasn't giving any effective order to the list.
Changed the default sort to '-name' and it worked perfectly.
@@bmsos It was happening with me too and thank you for the solution
thank you for the solution
Using pagination will break the filter method as it will modify the query at the end. Thus, in Postman, we will obtain all movie lists when filtering as defined by const limit = (entered limit is empty when filtering) || 10 .
❤
Thanks
the complete code
const excludeFields = ['sort', 'page', 'limit', 'fields']
const queryObj = { ...req.query }
excludeFields.forEach((el) => delete queryObj[el])
//Advance Filtering (greater than/ less than/ greater than equal to/ less than equal to)
let queryStr = JSON.stringify(queryObj)
const regex = /\b(gte|gt|lte|lt)\b/g
queryStr = queryStr.replace(regex, (match) => `$${match}`)
const queryObj1 = JSON.parse(queryStr)
//Sorting with one or more conditions
let query = Movie.find(queryObj1)
req.query.sort
? query.sort(req.query.sort.split(',').join(' '))
: query.sort('-name')
//Limiting Fields
req.query.fields
? query.select(req.query.fields.split(',').join(' '))
: query.select('-__v')
//Pagination
const page = +req.query.page || 1
const limit = +req.query.limit || 5
const skip = (page - 1) * limit
query = query.skip(skip).limit(limit)
if (req.query.page) {
const moviesCount = await Movie.countDocuments()
if (skip >= moviesCount)
throw new Error(' There are no records to display!!')
}
const movies = await query
I appreciate the explanation of the pagination. But the logic becomes wrong when filters are applied. The count returns total records, while the filter gives some of the selected records.
Ex.
Total records Is 20.
After Filter total records are 7
While we request
ratings[lte]=8&page=3&limit=5
Instead of throwing error it will return empty records.
jonas copy paste !!!!!!!!!!!!!!! 🥲🥲🥲🥲
a bit didn't understand the purpose of last error handling , did it this way
if (movies.length === 0) {
throw new Error("There is no more movies!");
}
delete querryObj.page;
delete querryObj.limit;
delete querryObj.sort
delete querryObj.fields
console.log(querryObj);
let query = Movie.find(querryObj); add this if pagination is not working