Khái niệm chung về "phân trang" là sử dụng .skip()
về cơ bản "bỏ qua" các kết quả đã được truy xuất, vì vậy về cơ bản bạn có thể thực hiện việc này:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Nhưng thực sự, như bạn có thể tưởng tượng, điều này sẽ chậm lại đáng kể khi bạn nhận được một vài "trang". Vì vậy, bạn thực sự muốn một cái gì đó thông minh hơn. Về cơ bản, đây là "truy vấn phạm vi" mà bạn muốn lấy kết quả cao hơn (hoặc thấp hơn nếu giảm dần) so với tập kết quả cuối cùng được truy xuất. Vì vậy, với giá trị cuối cùng của 5
sau đó lớn hơn bạn sẽ làm:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Có vẻ ổn, nhưng thực sự vẫn còn một vấn đề. Điều gì sẽ xảy ra nếu "trang" tiếp theo cũng chứa kết quả với xếp hạng 5? Truy vấn này sẽ bỏ qua những truy vấn đó và không bao giờ hiển thị chúng.
Điều thông minh cần làm là "giữ" tất cả _id
các giá trị từ tài liệu vì chúng là các khóa duy nhất. Về cơ bản áp dụng cùng một loại, ngoại trừ lần này, bạn đảm bảo rằng bạn không đưa kết quả từ trang trước vào trang mới. $nin
toán tử trợ giúp ở đây:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Liệu seenIds
chỉ là trang cuối cùng của kết quả hoặc một số trang khác tùy thuộc vào "mật độ" của giá trị mà bạn đang sắp xếp và tất nhiên bạn cần "giữ" những giá trị này trong biến phiên hoặc thứ gì đó.
Nhưng hãy cố gắng điều chỉnh điều này, vì các truy vấn phạm vi thường là kết quả hiệu suất tốt nhất của bạn.