Skip() nie wykorzystuje skutecznie indeksu, więc umieszczanie indeksu w dowolnym polu w kolekcji byłoby bezcelowe.
Ponieważ chcesz skip()
n-ty dokument, jeśli wartość skip()
jest niski (w zależności od systemu, ale zwykle poniżej 100 tys. wierszy przy pełnym skanowaniu kolekcji), to może być OK. Problem w tym, że normalnie tak nie jest. Mongo, nawet z indeksem, będzie musiał przeskanować cały zestaw wyników, zanim będzie mógł go pominąć, co spowoduje pełne skanowanie kolekcji bez względu na to, co w zapytaniu.
Gdybyś miał to robić często i losowo, lepiej byłoby użyć rosnącego identyfikatora łączącego inną kolekcję z findAndModify
aby uzyskać dokładny numer dokumentu ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
To jednak powoduje problemy, musisz zachować ten identyfikator, zwłaszcza gdy wystąpią usunięcia. Jedną z metod jest oznaczenie dokumentów jako usuniętych zamiast faktycznego ich usuwania. Gdy pytasz o dokładny dokument, który pomijasz, usuwasz i limit()
o jeden, co pozwala na uzyskanie następnego dokumentu najbliższego tej pozycji, w ten sposób:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();