As one might notice, this class does not implement a hasNext() or next() method as opposed to the now deprecated Mongo driver.
If, for any reason, you need to pull data from the cursor procedurally or otherwise need to override the behavior of foreach while iterating on the cursor, the SPL \IteratorIterator class can be used. When doing so, it is important to rewind the iterator before using it, otherwise you won't get any data back.
<?php
$cursor = $collection->find();
$it = new \IteratorIterator($cursor);
$it->rewind(); // Very important
while($doc = $it->current()) {
var_dump($doc);
$it->next();
}
?>
I used this trick to build a backward compatibility wrapper emulating the old Mongo driver in order to upgrade an older codebase.MongoDB\Driver\Cursor
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
MongoDB\Driver\Cursor
Референца за `class.mongodb-driver-cursor.php` со подобрена типографија и навигација.
The MongoDB\Driver\Cursor class
класата MongoDB\Driver\BulkWrite
Вовед
На MongoDB\Driver\Cursor класата MongoDB\Driver\Cursor , што е непроменлива вредносна објект што претставува команда на базата на податоци. Командата потоа може да се изврши со or ги инкапсулира резултатите од команда или прашање на MongoDB и може да биде вратена од, соодветно.
Синопсис на класата
Дневник на промени
| Верзија | = NULL |
|---|---|
| MongoDB\Driver\Manager::executeQuery() | PECL mongodb 1.12.0 Итератор. |
| својство рачно. | PECL mongodb 1.12.0 MongoDB\Driver\CursorInterface, кој се протега Траверзабилно. |
Примери
PECL mongodb 1.9.0
, што е непроменлива вредносна објект што претставува команда на базата на податоци. Командата потоа може да се изврши со and ги инкапсулира резултатите од команда или прашање на MongoDB и може да биде вратена од Пример #1 Читање на сет на резултати MongoDB\Driver\Cursor и двете ги враќаат своите резултати како
Кога корисникот ќе кликне некаде на сликата, придружната форма ќе биде предадена на серверот со две дополнителни променливи: MongoDB\Driver\Cursor објект. Овој објект може да се користи за итерација низ сетот на резултати од командата или прашањето.
Траверзабилно го имплементира
foreach.
<?php
$manager = new MongoDB\Driver\Manager();
/* Insert some documents so that our query returns information */
$bulkWrite = new MongoDB\Driver\BulkWrite;
$bulkWrite->insert(['name' => 'Ceres', 'size' => 946, 'distance' => 2.766]);
$bulkWrite->insert(['name' => 'Vesta', 'size' => 525, 'distance' => 2.362]);
$manager->executeBulkWrite("test.asteroids", $bulkWrite);
/* Query for all the items in the collection */
$query = new MongoDB\Driver\Query( [] );
/* Query the "asteroids" collection of the "test" database */
$cursor = $manager->executeQuery("test.asteroids", $query);
/* $cursor now contains an object that wraps around the result set. Use
* foreach() to iterate over all the result */
foreach($cursor as $document) {
print_r($document);
}
?>Горниот пример ќе прикаже нешто слично на:
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 Читање на сет на резултати за tailable курсор » Tailable курсори се посебен тип на курсор на MongoDB што му овозможува на клиентот да прочита некои резултати и потоа да чека додека не станат достапни повеќе документи. Овие курсори се користат првенствено со and Позитивен цел број што означува временско ограничување во милисекунди за серверот да блокира getMore операција ако нема достапни податоци. Оваа опција треба да се користи само во комбинација со команди што враќаат tailable курсор (на пр..
» Capped Collections foreachДодека нормалните курсори можат да се итерираат еднаш со
foreach , тој пристап нема да работи со tailable курсори. Кога
foreach се користи со tailable курсор, циклусот ќе престане по достигнувањето на крајот на почетниот сет на резултати. Обидот за продолжување на итерацијата на курсорот со втор
би фрлил исклучок, бидејќи PHP се обидува да го премота курсорот. Слично на објектите за резултати во други драјвери за бази на податоци, курсорите во MongoDB поддржуваат само напред итерација, што значи дека не можат да се премотуваат. IteratorIteratorЗа да читате континуирано од tailable курсор, објектот Cursor мора да биде завиткан со
. Ова му овозможува на апликацијата директно да ја контролира итерацијата на курсорот, да избегне случајно премотување на курсорот и да одлучи кога да чека нови резултати или целосно да ја прекине итерацијата. » креирај команда и продолжи да вметнуваш нов документ во таа колекција секоја секунда.
<?php
$manager = new MongoDB\Driver\Manager;
$manager->executeCommand('test', new MongoDB\Driver\Command([
'create' => 'asteroids',
'capped' => true,
'size' => 1048576,
]));
while (true) {
$bulkWrite = new MongoDB\Driver\BulkWrite;
$bulkWrite->insert(['createdAt' => new MongoDB\BSON\UTCDateTime]);
$manager->executeBulkWrite('test.asteroids', $bulkWrite);
sleep(1);
}
?>
Додека скриптата за производство сè уште работи, може да се изврши втора скрипта за потрошувач за да ги прочита вметнатите документи користејќи таилејбл курсор, означен со tailable and awaitData опции до MongoDB\Driver\Query::__construct().
<?php
$manager = new MongoDB\Driver\Manager;
$query = new MongoDB\Driver\Query([], [
'tailable' => true,
'awaitData' => true,
]);
$cursor = $manager->executeQuery('test.asteroids', $query);
$iterator = new IteratorIterator($cursor);
$iterator->rewind();
while (true) {
if ($iterator->valid()) {
$document = $iterator->current();
printf("Consumed document created at: %s\n", $document->createdAt);
}
$iterator->next();
}
?>
Скриптата за потрошувач ќе започне со брзо печатење на сите достапни документи во затворената колекција (како да foreach било користено); сепак, нема да заврши кога ќе го достигне крајот на почетниот сет на резултати. Бидејќи курсорот е таилејбл, повикувањето
IteratorIterator::next() ќе блокира и ќе чека дополнителни резултати. IteratorIterator::valid() исто така се користи за проверка дали навистина има податоци достапни за читање во секој чекор.
Забелешка: Овој пример го користи
awaitDataопцијата за прашање за да му се наложи на серверот да блокира за краток период (на пр. една секунда) на крајот од сетот на резултати пред да врати одговор до драјверот. Ова се користи за да се спречи драјверот агресивно да го анкетира серверот кога нема достапни резултати.maxAwaitTimeMSопцијата може да се користи во комбинација соtailableandawaitDataза да се специфицира времето за кое серверот треба да блокира кога ќе го достигне крајот на сетот на резултати.
Errors/Exceptions
При итерирање низ објектот на курсорот, BSON податоците се претвораат во PHP променливи. Оваа итерација може да предизвика следниве исклучоци:
- ). Ако повикот не успее, ќе врати MongoDB\Driver\Exception\InvalidArgumentException MongoDB\BSON\toPHP() MongoDB\BSON\Unserializable.
- ). Ако повикот не успее, ќе врати MongoDB\Driver\Exception\UnexpectedValueException Десериализирана PHP вредност. ако влезот не содржеше точно еден BSON документ. Можни причини вклучуваат, но не се ограничени на, невалиден BSON, дополнителни податоци (по читање еден BSON документ) или неочекуван error.
Содржина
- MongoDB\Driver\Cursor::__construct — Креирај нов курсор (не се користи)
- MongoDB\Driver\Cursor::current — Брои деца на елемент
- MongoDB\Driver\Cursor::getId — Го враќа ID-то за овој курсор
- 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 — Checks if the current position in the cursor is valid
Белешки од корисници 5 белешки
If you find that it would be easier to use arrays (instead of objects) for the returned documents, add the following after executing your query:
$cursor->setTypeMap(['root' => 'array', 'document' => 'array', 'array' => 'array']);I noticed that ->sort is missing from the cursor. Seems like the old driver has more functionality.
[red.: The way how cursors are created is different between the drivers. In the old driver, the cursor would not be created until after the first rewind() call on the iterator.
In the new driver the cursor already exists. Because sort (and limit and skip) parameters need to be send to the server, they can not be called after the cursor already has been created.
You can use sort (and limit and skip) with the new driver as well, by specifying them as options to the Query as shown in this example: http://php.net/manual/en/mongodb-driver-query.construct.php#refsect1-mongodb-driver-query.construct-examples]There used to be a count() method in the old mongo extension (http://docs.php.net/manual/en/mongocursor.count.php), however, this feature seems to be deleted in mongodb.
I've seen some people use executeCommand() to do that, but I found it much more earier to just use the toArray() method and count the returned array.
For example:
$manager = new MongoDB\Driver\Manager();
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('db.collection', $query)->toArray();
var_dump(count($cursor));Since php-mongodb version 1.9.0 Cursor implements Iterator, but if you need to support older versions too, you can conditionally wrap the cursor with IteratorIterator:
<?php
$iterator = $collection->find();
if (!($iterator implements Iterator)) {
$iterator = new \IteratorIterator($iterator);
}
?>