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

Thực hiện phân trang trong mongodb

Khái niệm bạn đang nói đến có thể được gọi là "phân trang chuyển tiếp". Một lý do chính đáng cho việc đó là không giống như việc sử dụng .skip().limit() bổ ngữ này không thể được sử dụng để "quay lại" trang trước hoặc thực sự "bỏ qua" đến một trang cụ thể. Ít nhất là không cần quá nhiều nỗ lực để lưu trữ các trang "đã xem" hoặc "đã phát hiện", vì vậy nếu loại phân trang "liên kết đến trang" đó là những gì bạn muốn, thì tốt nhất bạn nên gắn bó với .skip().limit() cách tiếp cận, bất chấp những hạn chế về hiệu suất.

Nếu bạn chỉ "tiến lên phía trước" là một lựa chọn khả thi, thì đây là khái niệm cơ bản:

db.junk.find().limit(3)

{ "_id" : ObjectId("54c03f0c2f63310180151877"), "a" : 1, "b" : 1 }
{ "_id" : ObjectId("54c03f0c2f63310180151878"), "a" : 4, "b" : 4 }
{ "_id" : ObjectId("54c03f0c2f63310180151879"), "a" : 10, "b" : 10 }

Tất nhiên đó là trang đầu tiên của bạn với giới hạn 3 mục. Hãy xem xét điều đó ngay bây giờ với mã lặp lại con trỏ:

var lastSeen = null;
var cursor = db.junk.find().limit(3);

while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if (!cursor.hasNext())
     lastSeen = doc._id;
}

Vì vậy, lặp lại con trỏ và thực hiện một cái gì đó, và khi đúng là đến mục cuối cùng trong con trỏ, bạn lưu trữ lastSeen giá trị hiện tại _id :

ObjectId("54c03f0c2f63310180151879")

Trong các lần lặp lại tiếp theo, bạn chỉ cần cung cấp _id đó giá trị mà bạn giữ (trong phiên hoặc bất kỳ thứ gì) cho truy vấn:

var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);

while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if (!cursor.hasNext())
     lastSeen = doc._id;
}

{ "_id" : ObjectId("54c03f0c2f6331018015187a"), "a" : 1, "b" : 1 }
{ "_id" : ObjectId("54c03f0c2f6331018015187b"), "a" : 6, "b" : 6 }
{ "_id" : ObjectId("54c03f0c2f6331018015187c"), "a" : 7, "b" : 7 }

Và quá trình lặp đi lặp lại cho đến khi không thể thu được kết quả nào nữa.

Đó là quy trình cơ bản cho một đơn hàng tự nhiên, chẳng hạn như _id . Đối với những thứ khác, nó phức tạp hơn một chút. Hãy xem xét những điều sau:

{ "_id": 4, "rank": 3 }
{ "_id": 8, "rank": 3 }
{ "_id": 1, "rank": 3 }    
{ "_id": 3, "rank": 2 }

Để chia nó thành hai trang được sắp xếp theo thứ hạng thì điều về cơ bản bạn cần biết là những gì bạn đã "nhìn thấy" và loại trừ những kết quả đó. Vì vậy, nhìn vào trang đầu tiên:

var lastSeen = null;
var seenIds = [];
var cursor = db.junk.find().sort({ "rank": -1 }).limit(2);

while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if ( lastSeen != null && doc.rank != lastSeen )
       seenIds = [];
   seenIds.push(doc._id);
   if (!cursor.hasNext() || lastSeen == null)
     lastSeen = doc.rank;
}

{ "_id": 4, "rank": 3 }
{ "_id": 8, "rank": 3 }

Trong lần lặp tiếp theo, bạn muốn nhỏ hơn hoặc bằng điểm "xếp hạng" của LastSeen, nhưng cũng loại trừ những tài liệu đã thấy. Bạn thực hiện việc này với $nin nhà điều hành:

var cursor = db.junk.find(
    { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen }
).sort({ "rank": -1 }).limit(2);

while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
   if ( lastSeen != null && doc.rank != lastSeen )
       seenIds = [];
   seenIds.push(doc._id);
   if (!cursor.hasNext() || lastSeen == null)
     lastSeen = doc.rank;
}

{ "_id": 1, "rank": 3 }    
{ "_id": 3, "rank": 2 }

Bạn thực sự giữ được bao nhiêu "sawIds" tùy thuộc vào mức độ "chi tiết" của kết quả mà giá trị đó có khả năng thay đổi. Trong trường hợp này, bạn có thể kiểm tra xem điểm "xếp hạng" hiện tại có bằng với lastSeen hay không giá trị và loại bỏ seenIds hiện tại nội dung nên nó không phát triển nhiều.

Đó là các khái niệm cơ bản về "phân trang chuyển tiếp" để bạn thực hành và học hỏi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Các trường cập nhật theo chương trình trong Mongo và Meteor

  2. MongoDB nhóm lồng nhau?

  3. Mẹo quản lý cấu hình cơ sở dữ liệu của bạn

  4. mongod --bind_ip bằng cách sử dụng docker-compo phiên bản 2

  5. MongoDB $ substrCP