2012-04-09 11 views

Trả lời

33

cách tiếp cận "bỏ qua và giới hạn" không hiệu quả lắm khi bạn phân trang đến tập dữ liệu. Đó là hiệu quả là Shlemiel the Painter's algorithm.

Truy vấn phạm vi hiệu quả hơn nhiều (khi được chỉ mục hỗ trợ). Ví dụ, hãy tưởng tượng rằng bạn đang hiển thị tweet. kích thước trang của bạn là 20 và bạn đang trên trang 1000 và muốn vào trang tải 1001.

Truy vấn này

db.tweets.find().sort({created_at: -1}).skip(1001*20).limit(20) 

nhiều kém hiệu quả hơn

db.tweets.find({created_at: {$lt: last_displayed_date}}). 
      sort({created_at: -1}).limit(20); 

(với điều kiện bạn có chỉ số trên created_at).

Bạn nhận được ý tưởng: khi bạn tải một trang, hãy lưu ý dấu thời gian của tweet cuối cùng và sử dụng nó để truy vấn trang tiếp theo.

+1

Việc cần làm nếu có một số tweet được tạo cùng một lúc bởi những người dùng khác nhau nhưng tôi cần hiển thị chúng? –

+0

Chính xác cùng một mili giây? Tôi không nghĩ vậy. –

+1

Nếu trường hợp đó xảy ra, sắp xếp theo 'created_at: -1, user_id: 1' –