Docs Menu
Docs Home
/ /

Acceder a los datos desde un cursor

En esta guía, puede aprender cómo acceder a los datos de un cursor utilizando el controlador Ruby.

Un cursor es un mecanismo que devuelve los resultados de una operación de lectura en lotes iterables. Dado que un cursor solo contiene un subconjunto de documentos en un momento dado, reduce tanto el consumo de memoria como el número de solicitudes que el controlador envía al servidor.

No puedes acceder a la Mongo::Cursor clase directamente desde el código de la aplicación. Al usar el controlador Ruby para realizar una operación de lectura, este devuelve un objeto Mongo::Collection::View que representa la consulta. Una vez que se solicitan los resultados de la consulta al objeto Collection::View, el controlador almacena internamente estos resultados en un objeto Cursor. A continuación, el objeto Collection::View expone la interfaz Enumerable, respaldada por la clase Cursor, desde la cual se puede acceder a los resultados.

Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants de la Conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde su aplicación Ruby, cree un Mongo::Client objeto que se conecte a un clúster de Atlas y asigne los siguientes valores a las variables database collection y:

database = client.use('sample_restaurants')
collection = database[:restaurants]

Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía de introducción a MongoDB.

Para iterar sobre el contenido de un cursor, llame al método each en el objeto Mongo::Collection::View devuelto por la operación de lectura. Esto indica al controlador que realice la operación y devuelva cada resultado almacenado en Mongo::Cursor.

El siguiente ejemplo utiliza el método find para recuperar todos los documentos cuyo valor del campo name es "Dunkin' Donuts". A continuación, imprime cada documento almacenado en el 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 un cursor individualmente, llame al método first en el objeto Mongo::Collection::View devuelto por la operación de lectura.

El siguiente ejemplo busca todos los documentos de una colección cuyo valor name es "Dunkin' Donuts". A continuación, imprime el primer documento en el cursor llamando al 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"}

Advertencia

Si la cantidad y el tamaño de los documentos devueltos por su consulta exceden la memoria disponible de la aplicación, el programa se bloqueará. Si espera un conjunto de resultados grande, acceda al cursor iterativamente.

Para recuperar todos los documentos de un cursor, convierta el cursor en una matriz utilizando el método to_a en su objeto Mongo::Collection::View correspondiente.

El siguiente ejemplo llama al método to_a para almacenar los resultados del cursor en una matriz:

cursor = collection.find(name: "Dunkin' Donuts")
array_results = cursor.to_a

Al hacer una consulta en una colección con tamaño fijo, puedes usar un cursor con seguimiento que permanezca abierto después de que el cliente agote los resultados en un cursor. Para crear un cursor con seguimiento, pasa la opción cursor_type al método find. Configura esta opción en :tailable.

Por ejemplo, puede crear una colección limitada llamada vegetables, como se muestra en el siguiente código:

db = client.use('db')
collection = db[:vegetables, capped: true, size: 1024 * 1024]
collection.create
vegetables = [
{ name: 'cauliflower' },
{ name: 'zucchini' }
]
collection.insert_many(vegetables)

Luego, puede usar el siguiente código para recuperar todos los documentos de la colección vegetables y almacenar los resultados en un cursor adaptable. Una vez agotado el cursor, permanece abierto hasta recuperar tres 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"}

Si inserta otro documento en la colección vegetables, el código anterior imprime el nuevo documento y no recupera más resultados del cursor.

Para obtener más información sobre los cursores adaptables, consulte Cursores adaptables en el manual de MongoDB Server.

Para aprender más sobre alguna de las funciones tratadas en esta guía, consulta la siguiente documentación de la API:

Volver

Contabilizar documentos

En esta página