MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

php mongodb findet den n-ten Eintrag in der Sammlung

Skip() verwendet einen Index nicht effektiv, daher wäre es sinnlos, einen Index auf irgendein Feld innerhalb der Sammlung zu setzen.

Da Sie skip() möchten n-te Dokumente, wenn der Wert von skip() niedrig ist (hängt von Ihrem System ab, aber normalerweise unter 100.000 Zeilen bei einem vollständigen Sammlungsscan), dann könnte es in Ordnung sein. Das Problem ist, dass dies normalerweise nicht der Fall ist. Selbst mit einem Index muss Mongo den gesamten Ergebnissatz scannen, bevor er übersprungen werden kann, was unabhängig von Ihrer Abfrage einen vollständigen Sammlungsscan auslöst.

Wenn Sie dies häufig und auf zufällige Weise tun, ist es möglicherweise besser, eine inkrementierende ID zu verwenden, die eine andere Sammlung mit findAndModify kombiniert um eine genaue Dokumentnummer zu erstellen ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ).

Dies führt jedoch zu Problemen, insbesondere bei Löschvorgängen müssen Sie diese ID pflegen. Eine Methode, um dies zu umgehen, besteht darin, Dokumente als gelöscht zu markieren, anstatt sie tatsächlich zu löschen. Wenn Sie nach dem genauen Dokument fragen, lassen Sie Löschungen und limit() weg um eins, was es Ihnen ermöglicht, das nächste Dokument, das dieser Position am nächsten liegt, wie folgt zu erhalten:

$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();