Skip() använder inte ett index effektivt så att sätta ett index på något fält i samlingen skulle vara meningslöst.
Eftersom du vill skip()
n:te dokument, om värdet skip()
är låg (beror på ditt system men normalt under 100 000 rader vid en full samlingsskanning) kan det vara OK. Problemet är att det normalt inte är det. Mongo, även med ett index, kommer att behöva skanna hela resultatuppsättningen innan den kan hoppa över den, vilket kommer att inducera en fullständig samlingsskanning oavsett vad i din fråga.
Om du skulle göra detta ofta och på slumpmässiga sätt kan det vara bättre att använda ett ökande ID som kombinerar en annan samling med findAndModify
för att producera ett korrekt dokumentnummer ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
Detta orsakar dock problem, du måste behålla detta ID speciellt när raderingar inträffar. En metod kring detta är att markera dokument som borttagna istället för att faktiskt ta bort dem. När du frågar efter det exakta dokumentet utelämnar du raderingar och limit()
genom att en som låter dig få nästa dokument som ligger närmast den positionen så här:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();