Giới hạn bù đắp NodeJS

Đâ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

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,

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ệu

Trong cơ sở dữ liệu NOSQL, nó sẽ là

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,

0 và

1const tradesCollection = await Trades.find()

0

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ử

1const tradesCollection = await Trades.find()

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,

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 trang

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

    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 hoặc NOSQL

    1const tradesCollection = await Trades.find()

    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ộng
  • 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

Giới hạn bù đắp NodeJS

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ỏ

Giới hạn bù đắp NodeJS

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

Giới hạn bù đắp NodeJS

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

Phần bù và giới hạn trong API là gì?

Độ lệch & giới hạn . Nếu giá trị vượt quá giá trị tối đa, thì giá trị tối đa sẽ được sử dụng. Độ lệch tối đa cho phân trang dựa trên độ lệch là 9999. Phân trang dựa trên điểm đánh dấu được khuyến nghị khi cần độ lệch cao hơn. The maximum number of entries to return. If the value exceeds the maximum, then the maximum value will be used. The maximum offset for offset-based pagination is 9999 . Marker-based pagination is recommended when a higher offset is needed.

Nút bù là gì?

Nút Offset cho phép bạn định vị gốc của chuỗi biến dạng . Nó được tự động thêm vào giàn biến dạng của bạn khi bạn tạo giàn biến dạng Đường cong hoặc Đường bao bằng công cụ Rigging.

Phần bù được tính như thế nào trong phân trang?

đây là khoảng cách từ đầu trang
e. g. địa chỉ trong quá trình, A = 10.000
kích thước trang = 4k
bù trang = 10000 mod 4k = 10.000 mod 4096 = 1908
phép tính này được thực hiện nhanh chóng trên máy tính vì kích thước trang là lũy thừa của 2, e. g. , 4k = 2^12

Phân trang hoạt động như thế nào trong nút JS?

Phân trang trong NodeJS được định nghĩa là thêm các số để xác định số thứ tự của các trang . Trong phân trang, chúng tôi đã từng bỏ qua và giới hạn để giảm kích thước dữ liệu trong cơ sở dữ liệu khi chúng có số lượng rất lớn.