Skip() не използва ефективно индекс, така че поставянето на индекс в което и да е поле в колекцията би било безсмислено.
Тъй като искате да skip()
n-ти документи, ако стойността на skip()
е ниско (зависи от вашата система, но обикновено под 100 000 реда при пълно сканиране на колекция), тогава може да е наред. Проблемът е, че обикновено не е така. Mongo, дори и с индекс, ще трябва да сканира целия набор от резултати, преди да може да го пропусне, което ще предизвика пълно сканиране на колекцията, без значение какво във вашата заявка.
Ако трябваше да правите това често и по произволни начини, може би е по-добре да използвате нарастващ идентификатор, комбиниращ друга колекция с findAndModify
за създаване на точен номер на документ ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field).
Това обаче предизвиква проблеми, трябва да запазите този идентификатор, особено когато се изтриват. Един от методите за това е да маркирате документи като изтрити, вместо действително да ги изтривате. Когато правите заявка за точния документ, пропускате изтривания и limit()
чрез едно, което ви позволява да получите следващия най-близък документ до тази позиция по следния начин:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();