php mongodb найти n-й элемент в коллекции

Я пытаюсь получить n-ю запись в моей коллекции.
Кажется, это работает с помощью find() но я думаю, что есть более чистое решение, использующее findOne() и, возможно, sort() ?
может кто-нибудь помочь с лучшим способом написания этого, пожалуйста

 $mongo = new Mongo(); $db = $mongo->mydb; $collection = $db->user; $cursor = $collection->find(); $i=0; foreach ($cursor as $obj){ if ($i==3) echo $obj["_id"];//echo's the 3rd entry id $i++; } 

Приведенное здесь решение не применимо к моей проблеме, поэтому я задаю этот вопрос.

Related of "php mongodb найти n-й элемент в коллекции"

Используйте skip of (n-1), из вашего кода выше:

 $cursor = $collection->find(); $cursor->skip(3); $cursor->next(); $doc = $cursor->current(); 

Но я думаю, что лучший способ – сохранить счетчик в своем документе, который вы можете использовать в качестве индекса.

Skip () не использует индекс эффективно, поэтому размещение индекса в любом поле в коллекции будет бессмысленным.

Поскольку вы хотите skip() n-ые документы, если значение skip() низкое (зависит от вашей системы, но обычно под 100K строк при полном сканировании коллекции), тогда это может быть ОК. Проблема в том, что обычно это не так. Mongo, даже с индексом, потребуется для сканирования всего набора результатов, прежде чем сможет пропустить его, что вызовет полное сканирование коллекции независимо от того, что в вашем запросе.

Если бы вы делали это часто и случайным образом, было бы лучше использовать инкрементный идентификатор, объединяющий другую коллекцию с помощью findAndModify для получения точного номера документа ( http://www.mongodb.org/display/DOCS/How+to+ + + + + + + + ).

Это, однако, вызывает проблемы, вы должны использовать этот идентификатор, особенно когда удаляются. Один из методов заключается в том, чтобы пометить документы как удаленные, а не удалять их фактически. Когда вы запрашиваете точный документ, вы опускаете delete и limit() на один, позволяя получить следующий ближайший документ в эту позицию следующим образом:

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