Acessar dados de um cursor
Nesta página
Visão geral
Neste guia, você pode aprender como acessar dados de um cursor usando a Biblioteca PHP do MongoDB .
Um cursor é um mecanismo que retorna os resultados de uma operação de leitura em lotes iteráveis. Os cursores reduzem o consumo de memória e o número de solicitações do servidor , mantendo apenas um subconjunto de documentos a qualquer momento, em vez de retornar todos os documentos de uma só vez.
Sempre que a Biblioteca PHP MongoDB executa uma operação de leitura utilizando o método MongoDB\Collection::find()
, ela retorna os documentos correspondentes em uma instância do MongoDB\Driver\Cursor
.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir dos conjuntos de dados de amostra do Atlas. Para acessar essa coleção a partir do seu aplicação PHP , instancie um MongoDB\Client
que se conecte a um Atlas cluster e atribua o seguinte valor à sua variável $collection
:
$collection = $client->sample_restaurants->restaurants;
Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Acesse o conteúdo do cursor iterativamente
A classe MongoDB\Driver\Cursor
implementa a interface Iterator
, portanto, você pode usar um loop foreach
para iterar por seu conteúdo.
O exemplo a seguir usa o método MongoDB\Collection::find()
para recuperar todos os documentos nos quais o valor do campo name
é 'Dunkin' Donuts'
. Em seguida, ele imprime cada documento do cursor retornado pelo método find()
:
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40379573"} {"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40363098"} {"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40395071"} ...
Recuperar documentos individualmente
Para recuperar um documento individual de um cursor, chame o método current()
em uma instância MongoDB\Driver\Cursor
. Este método retorna o documento para o qual o cursor aponta inicialmente. Você pode continuar avançando o cursor chamando o método next()
, que instrui o cursor a ponto para o próximo documento recuperado.
O exemplo a seguir encontra todos os documentos em que o valor do campo name
é 'Dunkin' Donuts'
. Em seguida, ele imprime o primeiro documento recuperado chamando o método current()
em um cursor:
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); $cursor->rewind(); echo json_encode($cursor->current());
{"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40379573"}
Recuperar todos os documentos
Aviso
Se o número e o tamanho dos documentos retornados pela sua query excederem a memória disponível do aplicativo, seu programa falhará. Se você espera um conjunto de resultados grande, acesse o cursor iterativamente.
Para recuperar todos os documentos de um cursor, converta o cursor em uma array usando um dos seguintes métodos:
MongoDB\\Driver\\Cursor::toArray()
: Chame um objetoMongoDB\Driver\Cursor
iterator_to_array()
: Passe um objetoMongoDB\Driver\Cursor
como parâmetro
O exemplo seguinte chama o método toArray()
em um cursor para armazenar seus resultados em uma array:
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); $array_results = $cursor->toArray();
Cursores persistentes
Ao fazer query em uma collection limitada, você pode usar um cursor persistente que permanece aberto depois que o cliente esgota os resultados em um cursor. Para criar um cursor persistente, defina a opção cursorType
como MongoDB\Operation\Find::TAILABLE
em uma array. Em seguida, passe a array como um parâmetro de opções para o método MongoDB\Collection::find()
.
Por exemplo, você pode criar uma collection limitada chamada vegetables
que armazena documentos que representam Legumes, conforme mostrado no código a seguir:
$db = $client->db; $create_coll = $db->createCollection( 'vegetables', ['capped' => true, 'size' => 1024 * 1024] ); $vegetables = [ ['name' => 'cauliflower'], ['name' => 'zucchini'] ]; $collection = $db->vegetables; $result = $collection->insertMany($vegetables);
O código a seguir usa um cursor persistente para recuperar todos os documentos na coleção vegetables
. Depois que o cursor estiver esgotado, ele permanecerá aberto até a recuperação de três documentos:
$cursor = $collection->find([], ['cursorType' => MongoDB\Operation\Find::TAILABLE]); $cursor->rewind(); $docs_found = 0; while ($docs_found < 3) { if ($cursor->valid()) { $doc = $cursor->current(); echo json_encode($doc), PHP_EOL; $docs_found++; } $cursor->next(); }
{"_id":{"$oid":"..."},"name":"cauliflower"} {"_id":{"$oid":"..."},"name":"zucchini"}
Se você inserir outro documento na coleção vegetables
, o código anterior imprimirá o novo documento e fechará o loop while
.
Para saber mais sobre cursores tailable, consulte Cursores tailable no manual do MongoDB Server .
Informações adicionais
Para saber mais sobre operações de leitura, consulte o guia Recuperar dados .
Para saber mais sobre cursores, consulte as seguintes páginas na documentação da API da extensão:
Documentação da API
Para saber mais sobre o método find()
, consulte a documentação API para MongoDB\Collection::find()
.