Skip() bruger ikke et indeks effektivt, så det ville være meningsløst at sætte et indeks på et hvilket som helst felt i samlingen.
Da du ønsker at skip()
over n. dokumenter, hvis værdien skip()
er lav (afhænger af dit system, men normalt under 100.000 rækker på en fuld samlingsscanning), så kan det være OK. Problemet er, at det normalt ikke er det. Mongo vil, selv med et indeks, være forpligtet til at scanne hele resultatsættet, før det kan springes over det, hvilket vil fremkalde en fuld samlingsscanning, uanset hvad i din forespørgsel.
Hvis du skulle gøre dette ofte og på tilfældige måder, kunne det være bedre at bruge et stigende ID, der kombinerer en anden samling med findAndModify
at producere et nøjagtigt dokumentnummer ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
Dette inducerer dog problemer, du skal vedligeholde dette ID, især når der sker sletninger. En metode omkring dette er at markere dokumenter som slettede i stedet for faktisk at slette dem. Når du forespørger efter det nøjagtige dokument, udelader du sletninger og limit()
ved at en giver dig mulighed for at få det næstnærmeste dokument til den position som sådan:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();