Клас MongoDB\Driver\Cursor
(mongodb >=1.0.0)
Вступ
КлассMongoDB\Driver\Cursor містить результати команди MongoDB command або запиту та може бути повернутий MongoDB\Driver\Manager::executeCommand() або MongoDB\Driver\Manager::executeQuery()соответственно.
Огляд класів
final
class MongoDB\Driver\Cursor
implements
MongoDB\Driver\CursorInterface, Iterator {
/* Методы */
final private __construct()
public current(): array|object|null
final public getId(): MongoDB\Driver\CursorId
final public getServer(): MongoDB\Driver\Server
final public isDead(): bool
public key(): int
public next(): void
public rewind(): void
final public setTypeMap(array $typemap): void
final public toArray(): array
public valid(): bool
}
список змін
Версия | Опис |
---|---|
PECL mongodb 1.9.0 | Реалізує Iterator |
PECL mongodb 1.6.0 | Реалізує MongoDB\Driver\CursorInterface, який успадковує Traversable |
Приклади
Приклад #1 Reading a result set
Як MongoDB\Driver\Manager::executeCommand(), такMongoDB\Driver\Manager::executeQuery(), повертають свої результати у вигляді об'єкту MongoDB\Driver\Cursor
Оскільки MongoDB\Driver\Cursor реалізує інтерфейс Traversable, ви можете ітерувати за набором результату за допомогою foreach
Loading...
Висновок наведеного прикладу буде схожим на:
stdClass Object
(
[_id] => MongoDB\BSON\ObjectId Object
(
[oid] => 5a4cff2f122d3321565d8cc2
)
[name] => Ceres
[size] => 946
[distance] => 2.766
)
stdClass Object
(
[_id] => MongoDB\BSON\ObjectId Object
(
[oid] => 5a4cff2f122d3321565d8cc3
)
[name] => Vesta
[size] => 525
[distance] => 2.362
}
Приклад #2 Читання результатів для хвостового курсору
» Хвостові курсори - - це особливий тип курсору MongoDB, який дозволяє клієнту читати деякі результати, а потім чекати, доки не з'являться додаткові документи. Ці курсори в основному використовуються з » Capped Collections і » Change Streams
Хоча звичайні курсори можна ітерувати один раз за допомогою foreach
, цей підхід не працюватиме з хвостовими курсорами. Коли foreach
використовується з хвостовим курсором, цикл зупиняється після досягнення кінця початкового набору результатів. Спроба продовжити ітерацію курсору з другим foreach
викинути виняток, оскільки PHP намагається перемотати курсор. Подібно до об'єктів результатів в інших драйверах баз даних, курсори в MongoDB підтримують лише ітерацію вперед, що означає, що вони не можуть бути перемотані.
Для безперервного зчитування з хвостового курсору об'єкт курсора повинен бути загорнутий за допомогою IteratorIterator. Це дозволяє застосуванню безпосередньо керувати ітерацією курсору, уникати ненавмисного перемотування курсору і вирішувати, коли чекати на нові результати або повністю припинити ітерацію.
Щоб продемонструвати хвостовий курсор у дії, будуть використовуватися два скрипти: "виробник" (producer) та "споживач" (consumer). Скрипт продюсера створить нову capped-колекцію, використовуючи команду » create і почне вставляти новий документ у цю колекцію кожну секунду.
Loading...
Коли скрипт продюсера (producer) все ще запущений, може бути виконаний другий скрипт для читання вставлених документів за допомогою хвостового (tailable) курсора, позначеного параметрами tailable
иawaitData
дляMongoDB\Driver\Query::__construct()
Loading...
Скрипт користувача почне з швидкого друку всіх доступних документів у заблокованій колекції (як би використовувався foreach
); однак, при досягненні кінця початкового набору результатів він не завершиться. Оскільки курсор є хвостовим, виклик IteratorIterator::valid() буде блокувати та чекати на додаткові результати . IteratorIterator::valid() також використовується для перевірки наявності на кожному етапі даних, доступних для читання.
Зауваження: У цьому прикладі використовується опція запиту
awaitData
, щоб проінструктувати сервер блокувати протягом короткого періоду (наприклад, одну секунду) наприкінці набору результатів перед поверненням відповіді драйверу. Це використовується для запобігання агресивному опитуванню (polling) серверу за відсутності результатів. ПараметрmaxAwaitTimeMS
може використовуватися в поєднанні зtailable
иawaitData
, щоб вказати час, який сервер повинен блокувати, коли він досягне кінця набору результатів.
Помилки
При ітерації об'єктом курсору дані BSON перетворюються на змінні PHP. Ця ітерація може викликати такі винятки:
- Викидає MongoDB\Driver\Exception\InvalidArgumentExceptionякщо клас на карті типів не може бути створений або не реалізуєMongoDB\BSON\Unserializable
- ИсключениеMongoDB\Driver\Exception\UnexpectedValueExceptionвикидається, якщо вхідні дані не є одним документом BSON. Можливі причини включають, але не обмежені некоректним BSON, зайвими даними або несподіваною помилкою» libbson
Зміст
- MongoDB\Driver\Cursor::__construct— Створює новий об'єкт Cursor (не використовується)
- MongoDB\Driver\Cursor::current— Повертає поточний елемент
- MongoDB\Driver\Cursor::getId— Повертає ідентифікатор для курсору
- MongoDB\Driver\Cursor::getServer— Повертає сервер, пов'язаний із курсором
- MongoDB\Driver\Cursor::isDead— Перевіряє, чи курсор вичерпано, чи може містити додаткові результати.
- MongoDB\Driver\Cursor::key— Повертає індекс поточного результату у курсорі
- MongoDB\Driver\Cursor::next— Переміщує курсор на наступний результат
- MongoDB\Driver\Cursor::rewind— Переміщує курсор до першого результату
- MongoDB\Driver\Cursor::setTypeMap— Встановлює карту типу для десеріалізації BSON
- MongoDB\Driver\Cursor::toArray— Повертає масив, що містить усі результати курсору
- MongoDB\Driver\Cursor::valid— Перевіряє, чи поточна позиція курсору коректна.