Overview
En esta guía, aprenderá a personalizar la forma en que Mongoid devuelve los resultados de las consultas. MongoDB le permite realizar las siguientes acciones para modificar la forma en que se muestran los resultados:
Datos de muestra
Los ejemplos de esta guía utilizan el Band Modelo, que representa una banda o grupo musical. La definición del modelo Band puede variar en cada sección para mostrar distintas funcionalidades de consulta. Algunas secciones también utilizan el modelo Manager, que representa a la persona que representa a una banda, o el modelo Tour, que representa las presentaciones en vivo de una banda.
Devolver campos especificados
En MongoDB, laproyección es el proceso de especificar los campos que se incluirán o excluirán de los resultados. Mongoid proporciona los siguientes operadores para proyectar campos:
only: Especifica los campos a incluirwithout: Especifica los campos a excluir
Incluir campos
El método only recupera solo los campos especificados de la base de datos.
El siguiente código devuelve solo el campo name de los documentos en los que el valor del campo members es 4:
Band.where(members: 4).only(:name)
Nota
Campo _id
En MongoDB, el campo _id se incluye en los resultados incluso si no lo incluye explícitamente.
Si intenta hacer referencia a atributos que no se han cargado, Mongoid genera un error Mongoid::Errors::AttributeNotLoaded.
También puede utilizar el método only para incluir campos de documentos incrustados.
Tenga en cuenta que el modelo Band incorpora varios objetos Tour. Puede proyectar campos del modelo Tour, como year, como se muestra en el siguiente código:
bands = Band.only(:name, 'tours.year')
Después, puedes acceder a los campos incrustados de los documentos devueltos:
# Returns the first Tour object from # the first Band in the results bands.first.tours.first
Se pueden pasar campos de asociaciones referenciadas al método only, pero la proyección se ignora al cargar los objetos incrustados. Mongoid carga todos los campos de las asociaciones referenciadas. Por ejemplo, al acceder al objeto incrustado Tour, como se muestra en el código anterior, Mongoid devuelve el objeto completo, no solo el campo year.
Nota
Si está conectado a una implementación que ejecuta MongoDB 4.4 o posterior, no puede especificar una asociación y sus campos en una proyección en la misma consulta.
Si un documento contiene asociaciones has_one o has_and_belongs_to_many y desea que Mongoid cargue esas asociaciones cuando llame al método only, debe incluir los campos con claves externas en la lista de atributos.
En el siguiente ejemplo, los modelos Band y Manager tienen una asociación has_and_belongs_to_many:
class Band include Mongoid::Document field :name, type: String has_and_belongs_to_many :managers end class Manager include Mongoid::Document has_and_belongs_to_many :bands end
El siguiente código demuestra cómo Mongoid puede cargar los objetos Manager asociados si incluye el campo manager_ids:
# Returns null Band.where(name: 'Astral Projection').only(:name).first.managers # Returns the first Manager object Band.where(name: 'Astral Projection').only(:name, :manager_ids).first.managers
Excluir campos
Puede excluir campos explícitamente de los resultados utilizando el método without.
El siguiente código excluye el campo year de los objetos Band devueltos:
Band.where(members: 4).without(:year)
Importante
Campo _id
Mongoid requiere el _id campo para varias operaciones, por lo que no se puede excluir el _id campo ni el id alias de los resultados. Si se pasa _id o id al without método, Mongoid lo ignora.
Ordenar resultados
Puede especificar el orden en que Mongoid devuelve documentos utilizando los métodos order y order_by.
Estos métodos aceptan un hash que indica por qué campos ordenar los documentos y si utilizar un orden ascendente o descendente para cada campo.
Puede especificar la dirección de ordenación mediante números enteros, símbolos o cadenas. Recomendamos usar la misma sintaxis de ordenación en toda la aplicación para mantener la coherencia. La siguiente lista muestra cada sintaxis y cómo ordenar en los campos name y year:
Enteros
1(ascendente) y-1(descendente)Ejemplo:
Band.order(name: 1, year: -1)
Símbolos
:ascy:descEjemplo:
Band.order(name: :asc, year: :desc)
Cadenas
"asc"y"desc"Ejemplo:
Band.order_by(name: "asc", year: "desc")
El método order también acepta las siguientes especificaciones de clasificación:
Matriz de matrices de dos elementos:
Instrumentos de cuerda
Ejemplo:
Band.order([['name', 'asc'], ['year', 'desc']])
Símbolos
Ejemplo:
Band.order([[:name, :asc], [:year, :desc]])
ascy métodosdescen símbolosEjemplo:
Band.order(:name.asc, :year.desc)
Sintaxis SQL
Ejemplo:
Band.order('name asc', 'year desc')
Tip
En lugar de utilizar order o order_by, también puede utilizar los métodos asc y desc para especificar órdenes de clasificación:
Band.asc('name').desc('year')
Al encadenar especificaciones de clasificación, la primera llamada define el primer orden de clasificación y la llamada más reciente define el último orden de clasificación después de que se hayan aplicado las clasificaciones anteriores.
Nota
Ordenación en ámbitos
Si defines una alcance predeterminado en su modelo que incluye una especificación de ordenamiento, el ordenamiento del alcance tiene prioridad sobre el ordenamiento especificado en una consulta, porque el alcance predeterminado se evalúa primero.
Paginación de resultados
Mongoid proporciona los métodos de paginación limit, skip y batch_size que puedes usar en objetos Criteria. Las siguientes secciones describen cómo utilizar estos operadores.
Limitar el número de resultados
Puede utilizar el método limit para limitar la cantidad de resultados que devuelve Mongoid.
El siguiente código recupera un máximo de 5 documentos:
Band.limit(5)
Nota
Alternativamente, puede utilizar el método take para recuperar una cantidad específica de documentos de la base de datos:
Band.take(5)
Saltar resultados
Puede omitir una cantidad específica de resultados utilizando el método skip o su alias offset.
Si encadena una llamada limit a skip, el límite se aplica después de omitir los documentos, como se muestra en el siguiente ejemplo:
Band.skip(2).limit(5) # Skips the first two results and returns # the following five results
Tip
Al realizar la paginación, utilice skip en los resultados ordenados para garantizar resultados consistentes.
El siguiente código omite los primeros 3 documentos al devolver resultados:
Band.skip(3) # Equivalent Band.offset(3)
Generar lotes de resultados
Al ejecutar consultas grandes e iterar sobre los resultados de la consulta mediante un método enumerador Criteria#each como, Mongoid usa automáticamente el comando getMore de MongoDB para cargar los resultados en lotes. El tamaño predeterminado del lote 1000 es, pero se puede establecer un valor diferente con el batch_size método.
El siguiente código establece el tamaño del lote en 500:
Band.batch_size(500)
Información Adicional
Para obtener un catálogo completo de los métodos que puede utilizar en Criteria objetos para modificar los resultados de la consulta, consulte la referencia del módulo Mongoid::Criteria::Queryable en la documentación de la API.
Para obtener más información sobre cómo construir consultas, consulte la guía Especificar una consulta de documento.
Para obtener más información sobre el modelado de datos de Mongoid, consulte las guías Modele sus datos.