One *VERY* important note, if You do:
$cursor = $collection->find(array(), array('_id' => 0)); // ommit '_id' field in result
then:
var_dump(iterator_to_array($cursor));
will return only *ONE* document, not all!
(PECL mongo >=0.9.0)
Курсор используется для итерации результатов запроса к базе данных. Например, чтобы запросить базу данных и увидеть все результаты, вы можете сделать:
Пример #1 Пример использования MongoCursor
<?php
$cursor = $collection->find();
var_dump(iterator_to_array($cursor));
?>
Обычно курсоры не создаются с помощью конструктора MongoCursor. Вы получаете новый курсор, вызывая MongoCollection::find() (как показано выше).
Предположим, что в приведенном выше примере $collection
была коллекцией 50 Гб.
Мы, конечно, не хотим загружать все сразу в память, для этого нужен курсор:
позволить клиенту получить доступ к коллекции по частям.
Если у нас большой набор результатов, мы можем выполнить итерацию, загружая несколько мегабайт результатов в память за раз. Например, мы могли бы сделать:
Пример #2 Итерации MongoCursor
<?php
$cursor = $collection->find();
foreach ($cursor as $doc) {
// делаем что-нибудь с каждым документом
}
?>
Обратите внимание, это означает, что курсор не содержит результаты базы данных, он просто управляет ими. Таким образом, если вы печатаете курсор (скажем, с помощью var_dump() или print_r()), вы просто получите объект курсора, а не документы. Чтобы получить сами документы, вы можете использовать один из способов, показанных выше.
MongoCursor имеет две "жизненные стадии": до и после выполнения запроса. Когда курсор создан, он еще не связался с базой данных, поэтому он находится в состоянии перед выполнением запроса. В этом состоянии клиент может дополнительно указать, что он хочет сделать запросом, включая добавление ограничений, пропусков, сортировок и более сложных параметров.
Когда клиент пытается получить результат (вызывая MongoCursor::next(), прямо или косвенно), курсор перемещается в стадию после выполнения запроса. На данный момент запрос был выполнен базой данных и больше не может быть изменен.
Пример #3 Добавление параметров в MongoCursor
<?php
$cursor = $collection->find()->limit(10);
// База данных еще не опрошена, поэтому можно добавить дополнительные параметры поиска
$cursor = $cursor->sort(array("a" => 1));
var_dump($cursor->getNext());
// теперь база данных была опрошена и больше опций не может быть добавлено
// так что это вызовет исключение:
$cursor->skip(4);
?>
FALSE
;$connection
, string $ns
[, array $query
= array()
[, array $fields
= array()
]] )Установленный в запросе флаг "slaveOkay", позволяет выполнять чтение на вторичном сервере (вторичные по умолчанию предназначены только для резервного копирования и не запрашиваются). Может быть переопределен с помощью MongoCursor::slaveOkay().
Эта функциональность устарела. Пожалуйста, используйте вместо этого Предпочтения чтения.
Установите время ожидания в миллисекундах для ответов базы данных.
Используйте -1
, чтобы ждать вечно.
Может быть переопределено с помощью MongoCursor::timeout().
Не приводит к тому, что сервер MongoDB отменяет операцию;
только к указанию драйверу прекратить ждать ответа
и выдать исключение MongoCursorTimeoutException по истечении заданного времени.
Для получения дополнительной информации о курсорах в MongoDB смотрите » документацию.
One *VERY* important note, if You do:
$cursor = $collection->find(array(), array('_id' => 0)); // ommit '_id' field in result
then:
var_dump(iterator_to_array($cursor));
will return only *ONE* document, not all!
Deprecated:
$cursor = $collection->find();
$cursor->limit(1);
Use instead:
$collection->find([], [ 'limit' => 1 ]);
If you want to know whether a cursor returned any results it is faster to use 'hasNext()' than 'count'
The documentation says $timeout is a static variable that can be set:
"Set timeout in milliseconds for all database responses."
This feature has been deprecated. Attempting to set it will result in a warning :
"PHP Deprecated: MongoCollection::find(): The 'MongoCursor::$timeout' static property is deprecated, please call MongoCursor->timeout() instead"