Overview
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. 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 Mongo::Cursor clase directamente desde tu código de aplicación. Cuando se usa 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 solicitas los resultados de la query del objeto Collection::View, el driver almacena internamente estos resultados en un objeto Cursor. A continuación, el Collection::View expone la interfaz Enumerable, respaldada por la clase Cursor, desde la cual se puede acceder a los resultados.
Datos de muestra
Los ejemplos de esta guía usan 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 objeto Mongo::Client que se conecte a un clúster Atlas y asigne los siguientes valores a las 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.
Acceder al contenido del cursor de forma iterativa
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 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"} ...
Recuperar documentos individualmente
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"}
Recuperar todos los documentos
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, 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
Cursores con seguimiento
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.
Documentación de la API
Para aprender más sobre alguna de las funciones tratadas en esta guía, consulta la siguiente documentación de la API: