Skip () không sử dụng chỉ mục một cách hiệu quả nên việc đặt chỉ mục vào bất kỳ trường nào trong bộ sưu tập sẽ là vô nghĩa.
Vì bạn muốn skip()
tài liệu thứ n, nếu giá trị của skip()
thấp (tùy thuộc vào hệ thống của bạn nhưng thông thường dưới 100 nghìn hàng khi quét toàn bộ bộ sưu tập) thì có thể OK. Vấn đề là bình thường nó không phải là. Mongo, ngay cả với một chỉ mục, sẽ được yêu cầu quét toàn bộ tập hợp kết quả trước khi có thể bỏ qua nó, điều này sẽ tạo ra một quá trình quét toàn bộ bộ sưu tập bất kể trong truy vấn của bạn là gì.
Nếu bạn phải làm điều này thường xuyên và theo những cách ngẫu nhiên, có thể tốt hơn là sử dụng ID tăng dần kết hợp một bộ sưu tập khác với findAndModify
để tạo ra một số tài liệu chính xác (http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Increcting+Field).
Tuy nhiên, điều này gây ra vấn đề, bạn phải ghi ID này đặc biệt là khi quá trình xóa xảy ra. Một phương pháp giải quyết vấn đề này là đánh dấu tài liệu là đã xóa thay vì thực sự xóa chúng. Khi bạn truy vấn tài liệu chính xác, bạn bỏ qua phần xóa và limit()
bằng cách cho phép bạn lấy tài liệu gần nhất tiếp theo đến vị trí đó như sau:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();