Я пытаюсь получить 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++; }
Приведенное здесь решение не применимо к моей проблеме, поэтому я задаю этот вопрос.
Используйте 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();