Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Acceder a datos desde un cursor

En esta guía, puedes aprender a acceder a datos desde un cursor usando el controlador de Ruby.

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

No puedes acceder a la clase Mongo::Cursor directamente desde tu código de aplicación. Cuando utilizas el driver de Ruby para realizar una operación de lectura, el driver retorna un objeto Mongo::Collection::View que representa la query. Una vez que solicites resultados de query del objeto Collection::View, el driver almacena internamente estos resultados en un objeto Cursor. A continuación, Collection::View expone la interfaz Enumerable, respaldada por la clase Cursor, desde la cual se pueden acceder a los resultados.

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

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 ejemplo, consulta la guía MongoDB Get Started.

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

El siguiente ejemplo utiliza el método find para recuperar todos los documentos en los que el valor del campo name es "Dunkin' Donuts". Luego, 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, llama al método first en el objeto Mongo::Collection::View devuelto por la operación de lectura.

El siguiente ejemplo encuentra todos los documentos en una colección que tienen un valor de name de "Dunkin' Donuts". Luego 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 devoluidos por tu query superan la memoria disponible de la aplicación, tu programa se bloqueará. Si esperas un conjunto de resultados grande, accede a tu cursor de forma iterativa.

Para recuperar todos los documentos de un cursor, convierte el cursor en un arreglo mediante el uso del 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 un arreglo:

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, puedes crear una colección con tamaño fijo 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, puedes usar el siguiente código para recuperar todos los documentos en la colección vegetables y almacenar los resultados en un cursor con seguimiento. Después de que el cursor se agota, 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 insertas 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 con seguimiento, consulta cursores con seguimiento en el manual del servidor de MongoDB.

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