Skip() non utilizza un indice in modo efficace, quindi inserire un indice su qualsiasi campo all'interno della raccolta sarebbe inutile.
Dal momento che desideri skip()
n-esimo documento, se il valore di skip()
è basso (dipende dal tuo sistema ma normalmente sotto 100.000 righe su una scansione completa della raccolta), quindi potrebbe essere OK. Il problema è che normalmente non lo è. Mongo, anche con un indice, dovrà scansionare l'intero set di risultati prima di poterlo saltare, il che indurrà una scansione completa della raccolta, indipendentemente dalla query.
Se dovessi farlo spesso e in modo casuale, potrebbe essere meglio utilizzare un ID incrementale combinando un'altra raccolta con findAndModify
per produrre un numero di documento accurato ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
Ciò tuttavia provoca problemi, è necessario mantenere questo ID soprattutto quando si verificano eliminazioni. Un metodo per aggirare questo problema è contrassegnare i documenti come eliminati invece di eliminarli effettivamente. Quando esegui una query per il documento esatto, ometti le eliminazioni e limit()
di uno permettendoti di ottenere il documento successivo più vicino a quella posizione in questo modo:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();