что является альтернативой MongoCursor:: hasNext в новом драйвере mongodb MongoDB\Driver\Cursor?

Новый драйвер php mongodb удалил метод hasNext.

http://php.net/manual/en/class.mongodb-driver-cursor.php

MongoDB\Driver\Cursor implements Traversable {

/* Methods */
    final private __construct ( void )
    final public MongoDB\Driver\CursorId getId ( void )
    final public MongoDB\Driver\Server getServer ( void )
    final public bool isDead ( void )
    final public void setTypeMap ( array $typemap )
    final public array toArray ( void )
}

Мы пытаемся обновить mongodb до последней версии 3.2 и драйвера mongodb php 1.1. Мы использовали hasNext в некоторых местах кода, которые нам нужно реорганизовать. Я попытался использовать этот https://secure.php.net/manual/en/class.mongodb-driver-cursor.php#118824

class MongodbCursor
{
    public static function hasNext(\MongoDB\Driver\Cursor $cursor)
    {
        $it = new \IteratorIterator($cursor);
        $it->rewind();
        return $it->valid();
    }
}

e.g.

 $cursor = some mongo query to get cursor

if (!MongodbCursor::hasNext($cursor)){

  //  since there is no data in above cursor, another query to get new cursor
  $cursor = 

}

foreach ($cursor as $item) {

}

Это дает ошибку ниже,

Cursors cannot yield multiple iterators

person vishal    schedule 08.11.2016    source источник


Ответы (1)


Вы можете использовать метод IteratorIterator, чтобы проверить, пуст ли курсор. Например:

$cursor = $collection->find(array('key'=> 'value'));
$it = new IteratorIterator($cursor);
$it->rewind();

if (!$it->current()){
    // Cursor is empty
    $cursor = $collection->find(array('anotherKey'=> 'anotherValue'));
    $it = new IteratorIterator($cursor);
    $it->rewind();
}
// Iterator all docs
while ($doc = $it->current()) {
    // Do something
    $it->next();
}

См. также Руководство по CRUD библиотеке MongoDB PHP

person Wan Bachtiar    schedule 09.11.2016
comment
$cursor-›toArray() это эффективно? Он извлечет все документы и преобразует их в массив? - person vishal; 09.11.2016
comment
Не знаю, почему минус. Ответ был давно отредактирован, чтобы не использовать toArray. - person Wan Bachtiar; 02.06.2017