Đây là một trong những phương pháp phân trang phổ biến nhất mà chúng tôi đang sử dụng trong nhiều thập kỷ. Nó chỉ đơn giản sử dụng
0 và1const fetchCompanies = async [req, res] => {
3 const limit = parseInt[req.query.limit]
4 const offset = parseInt[req.query.skip]
6 const tradesCollection = await Trades.find[]
9 const tradesCollectionCount = await Trades.count[]
11 const totalPages = Math.ceil[tradesCollectionCount / limit]
12 const currentPage = Math.ceil[tradesCollectionCount % offset]
17 total: tradesCollectionCount,
1 trong các truy vấn SQL để phân trang dữ liệu từ cơ sở dữ liệu1const fetchCompanies = async [req, res] => {
3 const limit = parseInt[req.query.limit]
4 const offset = parseInt[req.query.skip]
6 const tradesCollection = await Trades.find[]
9 const tradesCollectionCount = await Trades.count[]
11 const totalPages = Math.ceil[tradesCollectionCount / limit]
12 const currentPage = Math.ceil[tradesCollectionCount % offset]
17 total: tradesCollectionCount,
Trong cơ sở dữ liệu NOSQL, nó sẽ là
0 và1const fetchCompanies = async [req, res] => {
3 const limit = parseInt[req.query.limit]
4 const offset = parseInt[req.query.skip]
6 const tradesCollection = await Trades.find[]
9 const tradesCollectionCount = await Trades.count[]
11 const totalPages = Math.ceil[tradesCollectionCount / limit]
12 const currentPage = Math.ceil[tradesCollectionCount % offset]
17 total: tradesCollectionCount,
01const tradesCollection = await Trades.find[]
Toàn bộ mã nguồn có sẵn trong repo GitHub
Hãy triển khai nó trong ứng dụng của chúng tôi và xem những ưu điểm/nhược điểm của nó. Việc triển khai phân trang offset rất đơn giản,
1const fetchCompanies = async [req, res] => {
3 const limit = parseInt[req.query.limit]
4 const offset = parseInt[req.query.skip]
6 const tradesCollection = await Trades.find[]
9 const tradesCollectionCount = await Trades.count[]
11 const totalPages = Math.ceil[tradesCollectionCount / limit]
12 const currentPage = Math.ceil[tradesCollectionCount % offset]
17 total: tradesCollectionCount,
Một dòng quan trọng ở đây là,
1const tradesCollection = await Trades.find[]
MongoDB có các toán tử
0 và1const tradesCollection = await Trades.find[]
0 để triển khai phân trang dựa trên offset. Khi gửi phản hồi, nên gửi chúng cùng với dữ liệu phân trang1const fetchCompanies = async [req, res] => {
3 const limit = parseInt[req.query.limit]
4 const offset = parseInt[req.query.skip]
6 const tradesCollection = await Trades.find[]
9 const tradesCollectionCount = await Trades.count[]
11 const totalPages = Math.ceil[tradesCollectionCount / limit]
12 const currentPage = Math.ceil[tradesCollectionCount % offset]
17 total: tradesCollectionCount,
4 total: tradesCollectionCount,
Thử nghiệm
https. //youtube. be/hw6K-XR3o6Q
- Phân trang offset không mở rộng cho các bộ dữ liệu lớn. Sử dụng toán tử SQL
1 hoặc NOSQL1const fetchCompanies = async [req, res] => {
3 const limit = parseInt[req.query.limit]
4 const offset = parseInt[req.query.skip]
6 const tradesCollection = await Trades.find[]
9 const tradesCollectionCount = await Trades.count[]
11 const totalPages = Math.ceil[tradesCollectionCount / limit]
12 const currentPage = Math.ceil[tradesCollectionCount % offset]
17 total: tradesCollectionCount,
0. Nó quét từng bản ghi một và bỏ qua hoặc bù đắp nó. Nếu cơ sở dữ liệu của bạn có một triệu bản ghi, giống như chúng ta thấy trong hướng dẫn này, phân trang dựa trên offset có thể ảnh hưởng đến khả năng mở rộng1const tradesCollection = await Trades.find[]
- Nếu bạn có dữ liệu thời gian thực, phân trang dựa trên offset sẽ không đáng tin cậy và có vấn đề. Sẽ có bỏ qua dữ liệu hoặc dữ liệu trùng lặp. Đọc thêm
Phân trang dựa trên con trỏ sử dụng một bản ghi duy nhất làm con trỏ để tìm nạp. Khi chúng tôi chuyển một con trỏ và giới hạn, nó sẽ nhận được tất cả dữ liệu nhỏ hơn giá trị con trỏ cùng với giới hạn. Thực hiện phân trang dựa trên con trỏ với nodejs, mongoose
Điều quan trọng ở đây là giá trị con trỏ phải là tuần tự hoặc dấu thời gian. Theo cách đó, chúng ta có thể sử dụng các toán tử so sánh để lấy dữ liệu
Trước khi đi vào phần mã hóa của nó, hãy thực hiện một bước đơn giản về phân trang dựa trên con trỏ. Giả sử giới hạn là 8 và người dùng đang đưa ra yêu cầu
Khi nó xuất hiện lần đầu tiên, sẽ không có giá trị con trỏ và nó sẽ tìm nạp giá trị gần đây nhất
Ghi chú. Ở đây, chúng tôi sử dụng thời gian làm giá trị con trỏ theo thứ tự giảm dần
Cuộc gọi DB tìm nạp giá trị 8+1 từ DB vì chúng tôi cần giá trị thứ 9 làm con trỏ cho lần tìm nạp tiếp theo. Sau đó, chúng ta có thể gửi giá trị con trỏ cùng với yêu cầu tiếp theo. chúng ta cần so sánh giá trị con trỏ đó và tìm nạp dữ liệu nhỏ hơn con trỏ
Hãy xem việc triển khai phân trang dựa trên con trỏ
1const limit = parseInt[req.query.limit]
2const cursor = req.query.cursor
7 decryptedCursor = decrypt[cursor]
9 let decrypedDate = new Date[decryptedCursor * 1000]
11 tradesCollection = await Trades.find[{
13 $lt: new Date[decrypedDate],
20 tradesCollection = await Trades.find[{}]
25const hasMore = tradesCollection.length === limit + 1
29 const nextCursorRecord = tradesCollection[limit]
31 var unixTimestamp = Math.floor[nextCursorRecord.time.getTime[] / 1000]
33 nextCursor = encrypt[unixTimestamp.toString[]]
Ở đây, chúng tôi kiểm tra xem đó có phải là yêu cầu đầu tiên hay không dựa trên giá trị con trỏ. Nếu yêu cầu có một con trỏ làm thông số truy vấn, chúng tôi sẽ tìm nạp dữ liệu dựa trên đó
Ghi chú. Chúng tôi mã hóa giá trị con trỏ cho mục đích bảo mật. nên mã hóa giá trị con trỏ trước khi gửi chúng dưới dạng phản hồi [để bảo mật]
Nếu nó có con trỏ, chúng tôi sử dụng nó trong truy vấn DB của chúng tôi với một toán tử so sánh,
1tradesCollection = await Trades.find[{
3 $lt: new Date[decrypedDate],
Sau đó, chúng tôi có thể tìm xem cơ sở dữ liệu của chúng tôi có nhiều dữ liệu hơn hay không dựa trên điều kiện sau
________số 8
Vì, chúng tôi tìm nạp dữ liệu giới hạn + 1, chúng tôi có thể phát hiện ra rằng dữ liệu đó có nhiều dữ liệu hơn nếu dữ liệu được tìm nạp và giới hạn + 1 của chúng tôi giống nhau
Nếu nó có nhiều giá trị hơn, chúng ta cần xác định giá trị con trỏ tiếp theo. chúng ta có thể làm điều đó bằng cách sử dụng,
2 const nextCursorRecord = tradesCollection[limit]
4 var unixTimestamp = Math.floor[nextCursorRecord.time.getTime[] / 1000]
6 nextCursor = encrypt[unixTimestamp.toString[]]
Một điều quan trọng khác cần lưu ý ở đây là xóa phần tử cuối cùng khỏi dữ liệu đã tìm nạp. Bởi vì chúng tôi cần giá trị đó để tính toán con trỏ, nên nó không dành cho kết quả của người dùng cuối
Thử nghiệm
https. //youtube. be/1KhLGqtjaco
Đọc thêm
Phát triển phân trang API tại Slack
nút học tập
Khóa học
Bạn muốn nổi bật giữa đám đông?
Đừng mắc kẹt trong vòng lặp hướng dẫn. Tìm hiểu một công nghệ bằng cách thực hành các tình huống trong thế giới thực và nhận một công việc như một ông chủ. Đăng ký và nhận miễn phí các kịch bản vấn đề trong thế giới thực trong hộp thư đến của bạn