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

Tải chậm / Cuộn dữ liệu khác trong Mongoose / Nodejs

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose chuyển đối tượng yêu cầu tới phần mềm trung gian

  2. Angular Google Maps / NodeJS:Hiển thị điểm đánh dấu từ cơ sở dữ liệu

  3. MongoDB Kết nối SSL tự ký:Xác thực chứng chỉ ngang hàng SSL không thành công

  4. node.js MongoDB truy vấn không trả về kết quả

  5. Đặt cấu hình ủy quyền MongoDB trong Python-Eve