Skip() gebruikt een index niet effectief, dus het zou zinloos zijn om een index op een willekeurig veld in de verzameling te plaatsen.
Aangezien u wilt skip()
nde documenten, als de waarde van skip()
laag is (afhankelijk van uw systeem, maar normaal gesproken minder dan 100.000 rijen bij een volledige verzamelingsscan), dan is het mogelijk in orde. Het probleem is dat dat normaal gesproken niet zo is. Mongo, zelfs met een index, moet de volledige resultatenset scannen voordat deze kan worden overgeslagen, wat een volledige verzamelingsscan zal veroorzaken, ongeacht wat in uw zoekopdracht.
Als je dit vaak en op willekeurige manieren zou doen, is het misschien beter om een oplopende ID te gebruiken door een andere verzameling te combineren met findAndModify
om een nauwkeurig documentnummer te produceren ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
Dit veroorzaakt echter problemen, u moet deze ID behouden, vooral wanneer er verwijderingen plaatsvinden. Een methode hiervoor is om documenten als verwijderd te markeren in plaats van ze daadwerkelijk te verwijderen. Wanneer u naar het exacte document vraagt, laat u het verwijderen en limit()
. weg door één zodat u het volgende document dat het dichtst bij die positie ligt, als volgt kunt krijgen:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();