Skip() nepoužívá index efektivně, takže umístění indexu na libovolné pole v kolekci by bylo zbytečné.
Protože chcete skip()
n-tých dokumentů, pokud je hodnota skip()
je nízká (závisí na vašem systému, ale normálně pod 100 000 řádků při úplném skenování kolekce), pak to může být v pořádku. Problém je, že normálně tomu tak není. Mongo, dokonce i s indexem, bude muset naskenovat celou sadu výsledků, než ji bude moci přeskočit, což vyvolá úplné skenování kolekce bez ohledu na to, co je ve vašem dotazu.
Pokud byste to dělali často a náhodnými způsoby, mohlo by být lepší použít zvyšující se ID kombinující jinou kolekci s findAndModify
vytvořit přesné číslo dokumentu ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
To však způsobuje problémy, toto ID musíte zachovat, zvláště když dojde k odstranění. Jedním ze způsobů, jak toho dosáhnout, je označit dokumenty jako odstraněné místo jejich skutečného odstranění. Při dotazu na přesný dokument vynecháte smazání a limit()
o jeden, který vám umožní získat další nejbližší dokument k této pozici takto:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();