Skip() n'utilise pas efficacement un index, donc mettre un index sur n'importe quel champ de la collection serait inutile.
Puisque vous souhaitez skip()
nièmes documents, si la valeur de skip()
est faible (dépend de votre système, mais normalement inférieur à 100 000 lignes lors d'une analyse complète de la collection), cela peut être OK. Le problème est que normalement ce n'est pas le cas. Mongo, même avec un index, devra analyser l'intégralité du jeu de résultats avant de pouvoir l'ignorer, ce qui entraînera une analyse complète de la collection, quelle que soit la teneur de votre requête.
Si vous deviez le faire souvent et de manière aléatoire, il serait peut-être préférable d'utiliser un ID incrémentiel combinant une autre collection avec findAndModify
pour produire un numéro de document précis ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).
Ceci induit cependant des problèmes, vous devez conserver cet ID surtout lorsque des suppressions se produisent. Une méthode consiste à marquer les documents comme supprimés au lieu de les supprimer réellement. Lorsque vous recherchez le document exact, vous omettez les suppressions et limit()
par un vous permettant d'obtenir le prochain document le plus proche de cette position comme ceci :
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();