Menu Docs
Página inicial do Docs
/ / /
Ruby Driver
/ /

Acessar dados de um cursor

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.

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 .

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"}
...

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"}

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

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 .

Para saber mais sobre qualquer uma das funções discutidas nesta guia, consulte a seguinte documentação da API:

Voltar

Contagem de documentos

Nesta página