2012-09-22 25 views
9

Tôi muốn tạo một tính năng phân trang trong Bộ sưu tập của mình. Làm cách nào để tìm tài liệu có vị trí 'bắt đầu' và 'giới hạn' và nhận tổng số tài liệu trong một truy vấn?Cách tạo số trang với mongoose

Trả lời

18

Bạn không thể có được cả hai kết quả trong một truy vấn; tốt nhất bạn có thể làm là để có được cả hai sử dụng một Mongoose Query đối tượng:

var query = MyModel.find({}); 
query.count(function(err, count) {...}); 
query.skip(5).limit(10).exec('find', function(err, items) {...}); 

Sử dụng một khuôn khổ kiểm soát dòng chảy như async để sạch thực hiện chúng song song nếu cần thiết.

+0

Cảm ơn! Nó hoạt động cho tôi tốt – Erik

+1

Khi tôi chạy này exec trong truy vấn thứ hai trả về giống như đếm ... Liệu chức năng đếm sửa đổi truy vấn ban đầu ?? –

+1

@ZekeAlexandreNierenberg Bạn nói đúng, Zeke; mà phải có thay đổi như một số điểm. Tôi đã cập nhật ví dụ để thêm tham số ''find'' vào lệnh' exec' để làm cho nó hoạt động với Mongoose 3.6.20. – JohnnyHK

1

UPDATE:

Sử dụng bỏ qua và giới hạn là không tốt cho pagination. Here is the discussion over it.

@Wes Freeman, Đã có câu trả lời hay. Tôi đọc tư thế được liên kết, bạn nên sử dụng truy vấn phạm vi. n = 0; i = n + 10; db.students.find ({"id": {$ gt: n, $ lt: (n + i)}});

OLD ĐÁP (không sử dụng này)

sử dụng một cái gì đó giống như

n = db.students.find().skip(n).limit(10); 
//pass n dynamically, so for page 1 it should be 0 , page 2 it should be 10 etc 
hơn

tài liệu tại http://www.mongodb.org/display/DOCS/Advanced+Queries

+0

Cảm ơn bạn đã trả lời nhưng cần phải nhận tổng số tài liệu. – Erik

+0

total = db.students.find(). Count() –

+0

Wes Freeman, Đã có câu trả lời hay. Tôi đọc tư thế được liên kết, bạn nên sử dụng truy vấn phạm vi. n = 0; i = n + 10; db.students.find ({"id": {$ gt: n, $ lt: (n + i)}}); –

3

Nếu bạn dự định có nhiều trang, bạn không nên sử dụng bỏ qua/giới hạn, nhưng thay vì tính phạm vi.

câu trả lời

Xem Scott cho một câu hỏi tương tự: MongoDB - paging

6

Bạn có thể sử dụng plugin Mongoose Paginate:

$ npm install mongoose-paginate 

Sau khi ở các tuyến đường hoặc điều khiển của bạn, chỉ cần thêm:

Model.paginate({}, { page: 3, limit: 10 }, function(err, result) { 
    // result.docs 
    // result.total 
    // result.limit - 10 
    // result.page - 3 
    // result.pages 
}); 
0
user.find({_id:{$nin:friends_id},_id:{$ne:userId}},function(err,user_details){ 
    if (err) 
    res.send(err); 
    response ={ 
     statusCode:200, 
     status:true, 
     values:user_details 
    } 
    res.json(response); 
    }).skip(10).limit(1); 
+3

Câu trả lời của bạn có thể đúng, nhưng hãy cố gắng thêm nhiều ngữ cảnh hơn, vào mã của bạn để giúp mọi người có thể tìm kiếm cùng một nội dung. Vui lòng tham khảo [Làm cách nào để viết câu trả lời hay?] (Https://stackoverflow.com/help/how-to-answer) – rmjoia

+0

Vui lòng giải thích mã trong câu trả lời của bạn làm gì để những người có kiến ​​thức thấp trong các công nghệ liên quan có cơ hội hiểu và sử dụng lại nó. – Wndrr