MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Phân trang nhanh với MongoDB

Phân trang thông qua dữ liệu của bạn là một trong những thao tác phổ biến nhất với MongoDB. Một tình huống điển hình là cần phải hiển thị kết quả của bạn theo từng phần trong giao diện người dùng của bạn. Nếu bạn đang xử lý hàng loạt dữ liệu của mình, điều quan trọng là phải làm cho chiến lược phân trang của bạn chính xác để quá trình xử lý dữ liệu của bạn có thể mở rộng quy mô.

Hãy xem qua một ví dụ để xem các cách khác nhau để xem qua dữ liệu trong MongoDB. Trong ví dụ này, chúng tôi có một cơ sở dữ liệu CRM gồm dữ liệu người dùng mà chúng tôi cần xem qua và hiển thị 10 người dùng cùng một lúc. Vì vậy, trên thực tế, kích thước trang của chúng tôi là 10. Đây là cấu trúc của tài liệu người dùng của chúng tôi:

{
    _id,
    name,
    company,
    state
}

Phương pháp 1:Sử dụng bỏ qua () và giới hạn ()

MongoDB nguyên bản hỗ trợ hoạt động phân trang bằng cách sử dụng lệnh bỏ qua () và giới hạn (). Chỉ thị bỏ qua (n) cho MongoDB biết rằng nó nên bỏ qua các kết quả ‘n’ và chỉ thị giới hạn (n) chỉ thị MongoDB rằng nó nên giới hạn độ dài kết quả ở các kết quả ‘n’. Thông thường, bạn sẽ sử dụng lệnh bỏ qua () và giới hạn () với con trỏ của mình - nhưng để minh họa tình huống, chúng tôi cung cấp các lệnh bảng điều khiển sẽ đạt được kết quả tương tự. Ngoài ra, để viết ngắn gọn mã, mã kiểm tra giới hạn cũng bị loại trừ:

//Page 1
db.users.find().limit (10)
//Page 2
db.users.find().skip(10).limit(10)
//Page 3
db.users.find().skip(20).limit(10)
........

Bạn có được ý tưởng. Nói chung, để truy xuất trang ‘n’, mã trông giống như sau:

db.users.find().skip(pagesize*(n-1)).limit(pagesize)

Tuy nhiên, khi kích thước dữ liệu của bạn tăng lên, cách tiếp cận này có các vấn đề nghiêm trọng về hiệu suất. Lý do là mỗi khi truy vấn được thực thi, tập hợp kết quả đầy đủ được xây dựng, sau đó máy chủ phải đi bộ từ đầu tập hợp đến phần bù được chỉ định. Khi bù đắp của bạn tăng lên, quá trình này ngày càng chậm hơn. Ngoài ra, quá trình này không sử dụng hiệu quả các chỉ mục. Vì vậy, phương pháp ‘bỏ qua ()’ và ‘giới hạn ()’ thường hữu ích khi bạn có các tập dữ liệu nhỏ và nếu bạn đang làm việc với các tập dữ liệu lớn, bạn sẽ muốn xem xét các phương pháp tiếp cận khác.

Phương pháp 2:Sử dụng find () và limit ()

Lý do mà cách tiếp cận trước đó không chia tỷ lệ tốt là lệnh bỏ qua () và mục tiêu trong phần này là thực hiện phân trang mà không sử dụng lệnh ‘bỏ qua ()’. Đối với điều này, chúng tôi sẽ tận dụng thứ tự tự nhiên trong dữ liệu được lưu trữ như dấu thời gian hoặc id được lưu trữ trong tài liệu. Trong ví dụ này, chúng tôi sẽ sử dụng ‘_id’ được lưu trữ trong mỗi tài liệu. ‘_Id’ là một cấu trúc MongoDB ObjectID là một cấu trúc 12 byte chứa một dấu thời gian, được gia công, xử lý, bộ đếm, v.v. Ý tưởng tổng thể như sau:

1. Truy xuất _id của tài liệu cuối cùng trong trang hiện tại
2. Truy xuất các tài liệu lớn hơn “_id” này ở trang tiếp theo

//Page 1
db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...

//Page 2
users = db.users.find({'_id'> last_id}). limit(10);
//Update the last id with the id of the last document in this page
last_id = ...

Cách tiếp cận này tận dụng thứ tự vốn có tồn tại trong trường “_id”. Ngoài ra, vì trường “_id” được lập chỉ mục theo mặc định, hiệu suất của hoạt động tìm kiếm là rất tốt. Nếu trường bạn đang sử dụng không được lập chỉ mục, hiệu suất của bạn sẽ bị ảnh hưởng - vì vậy, điều quan trọng là đảm bảo trường đó được lập chỉ mục.

Ngoài ra, nếu bạn muốn dữ liệu của mình được sắp xếp theo một thứ tự cụ thể để phân trang, thì bạn cũng có thể sử dụng mệnh đề sort () với kỹ thuật trên. Điều quan trọng là đảm bảo rằng quy trình sắp xếp đang tận dụng một chỉ mục để có hiệu suất tốt nhất. Bạn có thể sử dụng hậu tố .explain () cho truy vấn của mình để xác định điều này:

users = db.users.find({'_id'> last_id}). sort(..).limit(10);
//Update the last id with the id of the last document in this page
last_id = ...

Như mọi khi nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào, vui lòng liên hệ với chúng tôi theo địa chỉ [email protected].


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách tính chênh lệch dấu thời gian trong mongodb (theo giờ)?

  2. MongoDB C #:ID Serialization mẫu tốt nhất

  3. Tạo Spring-data-mongodb nhiều người thuê

  4. Mongodb đứng ở đâu trong định lý CAP?

  5. Truy vấn phân cấp với Mongo bằng cách sử dụng $ graphLookup