Visão geral
Neste guia, você pode aprender como acessar dados de um cursor usando o driver Ruby.
Um cursor é um mecanismo que retorna os resultados de uma operação de leitura em lotes iteráveis. Como um cursor contém apenas um subconjunto de documentos a qualquer momento, os cursores reduzem o consumo de memória e o número de solicitações que o driver envia ao servidor.
Você não pode acessar a classe Mongo::Cursor
diretamente do código do seu aplicação . Quando você usa o driver Ruby para executar uma operação de leitura, o driver retorna um objeto Mongo::Collection::View
que representa a query. Depois de solicitar os resultados da query do objeto Collection::View
, o driver armazena internamente esses resultados em um objeto Cursor
. Em seguida, o Collection::View
expõe a interface Enumerable
, apoiada pela classe Cursor
, da qual você pode acessar os resultados.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados do sample_restaurants
a partir dosconjuntos de dados de amostra do Atlas. Para acessar essa coleção a partir do seu aplicação Ruby, crie um objeto Mongo::Client
que se conecte a um Atlas cluster e atribua os seguintes valores às suas variáveis database
e collection
:
database = client.use('sample_restaurants') collection = database[: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
Para iterar sobre o conteúdo de um cursor, chame o método each
no objeto Mongo::Collection::View
retornado pela operação de leitura. Isso instrui o driver a executar a operação e retornar cada resultado armazenado no Mongo::Cursor
.
O exemplo a seguir usa o método find
para recuperar todos os documentos nos quais o valor do campo name
é "Dunkin' Donuts"
. Em seguida, ele imprime cada documento armazenado no cursor:
cursor = collection.find(name: "Dunkin' Donuts") cursor.each do |doc| puts doc end
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"} {"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40379573"} {"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40392410"} ...
Recuperar documentos individualmente
Para recuperar documentos de um cursor individualmente, chame o método first
no objeto Mongo::Collection::View
retornado pela operação de leitura.
O exemplo a seguir encontra todos os documentos em uma collection que têm um valor de name
de "Dunkin' Donuts"
. Em seguida, ele imprime o primeiro documento no cursor chamando o método first
.
cursor = collection.find(name: "Dunkin' Donuts") first_doc = cursor.first puts first_doc
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"}
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 o método to_a
em seu objeto Mongo::Collection::View
correspondente.
O exemplo a seguir chama o método to_a
para armazenar os resultados do cursor em uma array:
cursor = collection.find(name: "Dunkin' Donuts") array_results = cursor.to_a
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, passe a opção cursor_type
para o método find
. Defina esta opção como :tailable
.
Por exemplo, você pode criar uma collection limitada chamada vegetables
, conforme mostrado no código a seguir:
db = client.use('db') collection = db[:vegetables, capped: true, size: 1024 * 1024] collection.create vegetables = [ { name: 'cauliflower' }, { name: 'zucchini' } ] collection.insert_many(vegetables)
Em seguida, você pode usar o seguinte código para recuperar todos os documentos na coleção vegetables
e armazenar os resultados em um cursor persistente. Depois que o cursor estiver esgotado, ele permanecerá aberto até a recuperação de três documentos:
cursor = collection.find({}, cursor_type: :tailable) docs_found = 0 cursor.each do |doc| puts doc docs_found += 1 break if docs_found >= 3 end
{"_id"=>BSON::ObjectId('...'), "name"=>"cauliflower"} {"_id"=>BSON::ObjectId('...'), "name"=>"zucchini"}
Se você inserir outro documento na coleção vegetables
, o código anterior imprimirá o novo documento e não recuperará mais resultados do cursor.
Para saber mais sobre cursores tailable, consulte Cursores tailable no manual do MongoDB Server .
Documentação da API
Para saber mais sobre qualquer uma das funções discutidas nesta guia, consulte a seguinte documentação da API: