Docs Menu
Docs Home
/ /

Modificar resultados de la consulta

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:

  • Devolver campos especificados

  • Ordenar resultados

  • Paginación de resultados

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.

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 incluir

  • without: Especifica los campos a excluir

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

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.

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 :asc y :desc

    • Ejemplo: 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]])

  • asc y métodos desc en símbolos

    • Ejemplo: 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.

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.

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)

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)

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)

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.

Volver

Consultas asincrónicas

En esta página