Đặt hàng theo subjectID
Nếu subjectID
của bạn là (hoặc có thể được thay đổi thành) một giá trị tăng đơn điệu (ví dụ:một ObjectID mặc định của MongoDB), bạn có một tùy chọn đơn giản bằng cách sử dụng find()
bình thường với sự sắp xếp, bỏ qua và giới hạn thích hợp. Trong trường hợp này, bạn có thể tìm tài liệu có chủ đề $gte
(lớn hơn hoặc bằng)
subjectID
của bạn :
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Khung tổng hợp
Như ở MongoDb 2.4, không có tính năng nào như vậy trong Khung tổng hợp để khớp dựa trên vị trí tài liệu trong đường dẫn kết quả. Bạn có thể gửi đề xuất tính năng mới cho MÁY CHỦ của dự án MongoDB Jira hàng đợi.
Có vẻ như bạn muốn một toán tử đường ống mới chẳng hạn như $matchfrom
sẽ bỏ qua bất kỳ tài liệu nào cho đến khi xuất hiện đầu tiên của $matchfrom
tiêu chuẩn. Sau đó, bạn có thể thêm $limit
để lấy n mục tiếp theo. Bạn cũng muốn có đầu ra được sắp xếp trước $matchfrom
vì vậy có một kết quả có thể đoán trước được.
Điều này có vẻ quá phức tạp so với việc tăng SubjectID, nhưng có thể có một trường hợp sử dụng để thực hiện phân trang dựa trên các tiêu chí tìm kiếm nâng cao hơn hoặc các kết quả được tính toán trong quy trình tổng hợp.
Các cách tiếp cận thay thế
Ngoài hỗ trợ trong tương lai cho một tính năng như vậy trong Khung tổng hợp, bạn có một số tùy chọn để triển khai phương pháp đối sánh tương tự trong mã:
-
sử dụng
group()
cũ hơn lệnh tổng hợp vớifinalize()
hàm số. LƯU Ý:group()
không làm việc với các cụm phân đoạn. -
sử dụng MapReduce và một
finalize()
chức năng -
tìm nạp toàn bộ tập hợp kết quả từ Khung tổng hợp và triển khai khớp / giảm kết quả trong mã ứng dụng của bạn (mặc dù điều này phần nào đánh bại khái niệm "phân trang" nếu bạn đang tìm nạp tất cả các trang cho mọi yêu cầu).
Cân nhắc về hiệu suất
Các truy vấn có skip
vẫn phải đọc qua các mục chỉ mục xen kẽ, vì vậy việc bỏ qua một số lượng lớn tài liệu sẽ không hiệu quả lắm.
Thay vì phân trang với phần bù bỏ qua, bạn có thể cân nhắc thực hiện các truy vấn trang liên tiếp bằng cách bắt đầu từ mục nhập cuối cùng của trang trước (tức là trang đầu tiên sẽ là $gte
SubjectID bắt đầu và các trang tiếp theo sẽ là $gt
chủ đề cuối cùng được bao gồm trên trang trước). Điều này sẽ phụ thuộc vào cách bạn trình bày phân trang trong giao diện người dùng của mình - sẽ dễ dàng nhất để sử dụng phương pháp này nếu giao diện người dùng của bạn chỉ có tùy chọn hiển thị trang "tiếp theo" của thông báo thay vì chuyển đến một trang cụ thể.