Overview
En esta guía, puede aprender cómo especificar una consulta utilizando Mongoid.
Puede refinar el conjunto de documentos que devuelve una consulta creando un filtro de consulta. Un filtro de consulta es una expresión que especifica los criterios de búsqueda que MongoDB utiliza para encontrar documentos en una operación de lectura o escritura. Al crear un filtro de consulta, puede solicitar al controlador que busque documentos que coincidan exactamente con su consulta o crear filtros de consulta para expresar criterios de coincidencia más complejos.
Mongoid proporciona un lenguaje de consulta específico del dominio (DSL) similar al utilizado en Active Record.
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 demostrar distintas funcionalidades de consulta. Algunas secciones pueden usar otros modelos para demostrar la funcionalidad de consulta.
Consultas en Mongoid
Los métodos de consulta de Mongoid devuelven objetos Mongoid::Criteria, que son contenedores encadenables y de evaluación diferida para la API de consultas de MongoDB. Las consultas se ejecutan al iterar los resultados. El siguiente ejemplo muestra el tipo de retorno de una consulta simple:
# Creates a simple query Band.where(name: "Deftones") # Returns a Criteria object # => #<Mongoid::Criteria # selector: {"name"=>"Deftones"} # options: {} # class: Band # embedded: false> # Evaluate the query by converting to JSON Band.where(name: "Deftones").to_json # Returns matching documents # => [{"_id":"...","name":"Deftones"}]
Puede usar métodos como first y last para devolver documentos individuales. También puede iterar un objeto Criteria con métodos como each o map para recuperar documentos del servidor. Puede usar to_json para convertir un objeto Criteria a JSON.
Tip
Encadenamiento de métodos
Si encadena otros métodos de consulta en un objeto Criteria existente, Mongoid fusiona los criterios de filtro.
Crear un filtro de query
Esta sección describe los patrones de sintaxis que puede usar para crear criterios de filtro. Puede especificar consultas en Mongoid usando cualquiera de los siguientes patrones de sintaxis:
Sintaxis de campo
Sintaxis de la API de consulta
Sintaxis del operador de símbolo
Nota
Comportamientos de sintaxis
Estas sintaxis permiten consultar documentos incrustados mediante notación de puntos. Las sintaxis también respetan alias de campo y tipos de campo, si el campo que se consulta está definido en la clase del modelo.
Los ejemplos de esta sección utilizan la siguiente definición de modelo:
class Band include Mongoid::Document field :name, type: String field :founded, type: Integer field :m, as: :member_count, type: Integer embeds_one :manager end class Manager include Mongoid::Document embedded_in :band field :name, type: String end
Sintaxis de campo
La sintaxis de consulta de campos utiliza los hashes básicos de Ruby. Las claves pueden ser símbolos o cadenas y corresponden a los nombres de campo en los documentos de MongoDB.
El siguiente código muestra dos consultas equivalentes que utilizan la sintaxis de consulta de campo para recuperar documentos en los que el valor del campo name es 'Depeche Mode':
Band.where(name: 'Depeche Mode') Band.where('name' => 'Depeche Mode')
Sintaxis de la API de consulta
Puede especificar un operador de API de consulta en cualquier campo utilizando la sintaxis hash, como lo muestran las siguientes consultas equivalentes:
Band.where(founded: {'$gt' => 1980}) Band.where('founded' => {'$gt' => 1980})
Sintaxis del Operador de Símbolos
Puede especificar operadores de API de consulta como métodos en símbolos para el nombre de campo respectivo, como se muestra en el siguiente código:
Band.where(:founded.gt => 1980)
Consulta sobre diferentes tipos de campos
Esta sección describe cómo realizar consultas en campos con diferentes tipos de valores.
Campos definidos
Para consultar un campo, no es necesario que este esté en la definición de la clase del modelo. Sin embargo, si un campo está definido en la clase del modelo, Mongoid convierte los valores de la consulta para que coincidan con los tipos de campo definidos al construir la consulta.
El siguiente código especifica un valor de cadena al consultar el campo founded. Dado que el campo founded está definido en la clase del modelo con valores Integer, Mongoid convierte la cadena '2020' en 2020 al realizar la consulta:
Band.where(founded: '2020')
Para obtener más información sobre cómo definir campos en Mongoid, consulte la Guíade tipos de campos.
Valores brutos
Para evitar el comportamiento de coerción de tipo de consulta de Mongoid y consultar directamente el valor tipificado sin formato en la base de datos, envuelva el valor de la consulta en la clase Mongoid::RawValue, como se muestra en el siguiente código:
Band.where(founded: Mongoid::RawValue('2020'))
Alias de campo
Las consultas siguen los nombres de los campos de almacenamiento y los alias de campos que haya configurado en la definición de la clase de modelo.
Los campos id y _id son alias, por lo que puede utilizar cualquiera de los nombres de campo en las consultas:
Band.where(id: '5ebdeddfe1b83265a376a760') Band.where(_id: '5ebdeddfe1b83265a376a760')
Documentos incrustados
Para consultar los valores de los campos de los documentos incrustados, puede usar la notación de puntos. El siguiente código recupera los documentos cuyo campo name del documento incrustado Manager es 'Smith':
Band.where('manager.name' => 'Smith')
El siguiente código demuestra cómo utilizar un operador de símbolo al realizar consultas en un campo incrustado:
Band.where(:'manager.name'.ne => 'Smith')
Nota
Las queries siempre retornan instancias del modelo de nivel superior, incluso si todas las condiciones hacen referencia a campos de documentos incrustados.
Operaciones lógicas
Mongoid admite las siguientes operaciones lógicas en objetos Criteria:
andornornot
Estos métodos toman uno o más hashes de condiciones u otro objeto Criteria como argumentos. La operación not tiene una versión sin argumentos.
El siguiente código demuestra cómo utilizar las operaciones lógicas en las consultas:
# Uses "and" to combine criteria Band.where(label: 'Trust in Trance').and(name: 'Astral Projection') # Uses "or" to specify criteria Band.where(label: 'Trust in Trance').or(Band.where(name: 'Astral Projection')) # Uses "not" to specify criteria Band.not(label: 'Trust in Trance', name: 'Astral Projection') # Uses "not" without arguments Band.not.where(label: 'Trust in Trance', name: 'Astral Projection')
Nota
Parámetros de matriz
Para garantizar la compatibilidad con versiones anteriores de Mongoid, los métodos de operación lógica aceptan matrices de parámetros, que se aplanan para obtener los criterios.
Pasar matrices a operaciones lógicas está obsoleto y podría eliminarse en una versión futura.
Las siguientes consultas producen las mismas condiciones:
# Conditions passed to separate "and" calls Band.and(name: 'Sun Kil Moon').and(member_count: 2) # Multiple conditions in the same "and" call Band.and({name: 'Sun Kil Moon'}, {member_count: 2}) # Multiple conditions in an array - Deprecated Band.and([{name: 'Sun Kil Moon'}, {member_count: 2}]) # Condition in "where" and a scope Band.where(name: 'Sun Kil Moon').and(Band.where(member_count: 2)) # Condition in "and" and a scope Band.and({name: 'Sun Kil Moon'}, Band.where(member_count: 2)) # Scope as an array element, nested arrays - Deprecated Band.and([Band.where(name: 'Sun Kil Moon'), [{member_count: 2}]])
Combinaciones de operadores
Los operadores lógicos tienen la misma semántica que los de Active Record.
Cuando se especifican condiciones en el mismo campo varias veces, todas las condiciones se agregan a los criterios, como lo muestran las consultas en el siguiente código:
# Combines as "and" Band.where(name: 'Swans').where(name: 'Feist') # Combines as "or" Band.where(name: 'Swans').or(name: 'Feist')
Las operaciones any_of, none_of, nor y not se comportan de manera similar.
Cuando se utilizan los operadores lógicos and, or y nor, estos operan sobre los criterios desarrollados hasta ese momento:
# "or" applies to the first condition, and the second is combined # as "and" Band.or(name: 'Sun').where(label: 'Trust') # Same as previous example - "where" and "and" are aliases Band.or(name: 'Sun').and(label: 'Trust') # Same operator can be stacked any number of times Band.or(name: 'Sun').or(label: 'Trust') # The last label condition is added to the top level as "and" Band.where(name: 'Sun').or(label: 'Trust').where(label: 'Feist') # Interpreted query: # {"$or"=>[{"name"=>"Sun"}, {"label"=>"Trust"}], "label"=>"Feist"}
no comportamiento
Puede usar el método not sin argumentos, en cuyo caso niega la siguiente condición especificada. El método not puede llamarse con una o más condiciones hash u objetos Criteria, que se niegan y se añaden a los criterios.
Los siguientes ejemplos demuestran el comportamiento de not:
# "not" negates "where" Band.not.where(name: 'Best') # The second "where" is added as "$and" Band.not.where(name: 'Best').where(label: /Records/) # "not" negates its argument Band.not(name: 'Best')
Nota
No se puede usar el operador $not en MongoDB con un argumento de cadena. Mongoid usa el operador $ne para lograr la negación:
# String negation - uses "$ne" Band.not.where(name: 'Best') # Regex negation - uses "$not" Band.not.where(name: /Best/)
De forma similar a and, la operación not niega condiciones individuales para criterios de campo simples. Para condiciones complejas y cuando un campo ya tiene una condición definida, Mongoid emula $not mediante una construcción {'$and' => [{'$nor' => ...}]}, ya que MongoDB admite el operador $not solo por campo, no globalmente:
# Simple condition Band.not(name: /Best/) # Complex conditions Band.where(name: /Best/).not(name: 'Astral Projection') # Symbol operator syntax Band.not(:name.ne => 'Astral Projection')
Si está utilizando not con matrices o expresiones regulares, consulte las limitaciones de $not en el manual del servidor.
Construcción de consultas incrementales
De forma predeterminada, al añadir condiciones a una consulta, Mongoid considera cada condición completa e independiente de cualquier otra condición presente en la consulta. Por ejemplo, llamar a in dos veces añade dos condiciones $in independientes:
Band.in(name: ['a']).in(name: ['b']) # Interpreted query: # {"name"=>{"$in"=>["a"]}, "$and"=>[{"name"=>{"$in"=>["b"]}}]}
Algunos métodos de operador permiten la creación incremental de la condición. Al agregar una condición que utiliza uno de los operadores compatibles, Mongoid comprueba si ya existe una condición en el mismo campo que utilice el mismo operador. De ser así, las expresiones de operador se combinan según la estrategia de fusión especificada. La siguiente sección describe las estrategias de fusión disponibles.
Estrategias de fusión
Mongoid proporciona las siguientes estrategias de fusión:
Anulación: la nueva instancia del operador reemplaza cualquier condición existente en el mismo campo utilizando el mismo operador.
Intersección: Si ya existe una condición que usa el mismo operador en el mismo campo, los valores de la condición existente se intersectan con los valores de la nueva condición y el resultado se almacena como el valor del operador.
Unión: Si ya existe una condición que utiliza el mismo operador en el mismo campo, los valores de la nueva condición se agregan a los valores de la condición existente y el resultado se almacena como el valor del operador.
El siguiente código demuestra cómo las estrategias de combinación producen criterios utilizando in como operador de ejemplo:
Band.in(name: ['a']).override.in(name: ['b']) # Interpreted query: # {"name"=>{"$in"=>["b"]}} Band.in(name: ['a', 'b']).intersect.in(name: ['b', 'c']) # Interpreted query: # {"name"=>{"$in"=>["b"]}} Band.in(name: ['a']).union.in(name: ['b']) # Interpreted query: # {"name"=>{"$in"=>["a", "b"]}}
La estrategia se solicita llamando a override, intersect o union en una instancia Criteria. La estrategia solicitada se aplica al siguiente método de condición llamado en la query. Si el siguiente método de condición llamado no admite soporte de estrategias de fusión, la estrategia se reinicia, como se muestra en el siguiente ejemplo:
Band.in(name: ['a']).union.ne(name: 'c').in(name: ['b']) # Interpreted query: # {"name"=>{"$in"=>["a"], "$ne"=>"c"}, "$and"=>[{"name"=>{"$in"=>["b"]}}]}
Dado que ne no admite estrategias de fusión, la estrategia union se ignora y se restablece. Al invocar in por segunda vez, no hay ninguna estrategia activa.
Advertencia
Las estrategias de fusión presuponen que las condiciones anteriores se han añadido al nivel superior de la consulta. Sin embargo, esto no siempre es así, ya que las condiciones pueden estar anidadas bajo una cláusula $and. El uso de estrategias de fusión con criterios complejos puede generar consultas incorrectas.
Métodos de operador admitidos
Los siguientes métodos de operador admiten estrategias de fusión:
allinnin
El conjunto de métodos podría ampliarse en futuras versiones de Mongoid. Para garantizar la compatibilidad futura, invoque un método de estrategia solo cuando la siguiente llamada al método sea un operador compatible con estrategias de fusión.
Las estrategias de fusión solo se aplican cuando se añaden condiciones mediante los métodos designados. En el siguiente ejemplo, la estrategia de fusión no se aplica porque la segunda condición se añade como where, no mediante in:
Band.in(name: ['a']).union.where(name: {'$in' => 'b'}) # Interpreted query: # {"foo"=>{"$in"=>["a"]}, "$and"=>[{"foo"=>{"$in"=>"b"}}]}
Expansión del valor del operador
Los métodos de operador que admiten estrategias de fusión toman Array como tipo de valor. Mongoid expande tipos compatibles con Array, como Range, cuando se utilizan con estos métodos de operador.
El siguiente ejemplo demuestra cómo se puede pasar un objeto Range como valor de consulta al utilizar el método in:
Band.in(year: 1950..1960) # Interpreted query: # {"year"=>{"$in"=>[1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960]}}
Mongoid envuelve valores distintos deArray en matrices, como se muestra en el siguiente ejemplo:
Band.in(year: 1950) # Interpreted query: {"year"=>{"$in"=>[1950]}}
Coincidencia de elementos
Puede utilizar el método elem_match para hacer coincidir documentos que contengan un campo de matriz con al menos un elemento que coincida con todos los criterios de consulta especificados.
El siguiente ejemplo crea un documento de muestra que contiene un campo de matriz. Luego, utiliza el método elem_match para buscar documentos cuyo campo de matriz tour contenga una entrada cuyo valor city sea 'London':
aerosmith = Band.create!(name: 'Aerosmith', tours: [ {city: 'London', year: 1995}, {city: 'New York', year: 1999}, ]) swans = Band.create!(name: 'Swans', tours: [ {city: 'Milan', year: 2014}, {city: 'Montreal', year: 2015}, ]) # Returns only "Aerosmith" Band.elem_match(tours: {city: 'London'})
Asociaciones
Puede utilizar el método elem_match para hacer coincidir asociaciones integradas.
Este ejemplo utiliza los siguientes modelos que definen una asociación integrada entre Band y Tour:
class Band include Mongoid::Document field :name, type: String embeds_many :tours end class Tour include Mongoid::Document field :city, type: String field :year, type: Integer embedded_in :band end
El siguiente código crea un objeto Band y objetos Tour incrustados, luego utiliza el método elem_match para consultar el campo city:
aerosmith = Band.create!(name: 'Aerosmith') Tour.create!(band: aerosmith, city: 'London', year: 1995) Tour.create!(band: aerosmith, city: 'New York', year: 1999) # Returns the "Aerosmith" document Band.elem_match(tours: {city: 'London'})
Nota
No se puede usar elem_match en asociaciones no incrustadas porque MongoDB no realiza una operación de unión en las colecciones. Si se realiza esta consulta, las condiciones se añaden a la colección que origina la asociación no incrustada, en lugar de a la colección de la asociación.
Puede utilizar elem_match para query asociaciones anidadas recursivamente, como se muestra en el siguiente ejemplo:
class Tag include Mongoid::Document field name:, type: String recursively_embeds_many end # Creates the root Tag root = Tag.create!(name: 'root') # Adds embedded Tags sub1 = Tag.new(name: 'sub_tag_1', child_tags: [Tag.new(name: 'sub_sub_tag_1')]) root.child_tags << sub1 root.child_tags << Tag.new(name: 'sub_tag_2') root.save! # Searches for Tag in which one child Tag tame is "sub_tag_1" Tag.elem_match(child_tags: {name: 'sub_tag_1'}) # Searches for a child Tag in which one child Tag tame is "sub_sub_tag_1" root.child_tags.elem_match(child_tags: {name: 'sub_sub_tag_1'})
Para obtener más información sobre las asociaciones, consulte la guía de Asociaciones.
Consulta por valor _id
Mongoid proporciona el método find, que le permite consultar documentos por sus valores _id.
El siguiente ejemplo utiliza el método find para hacer coincidir un documento con el valor especificado en el campo _id:
Band.find('6725342d4cb3e161059f91d7')
Nota
Conversión de tipos
Al pasar un valor de ID al método find, este lo convierte al tipo de dato declarado para el campo _id en el modelo. De forma predeterminada, el campo _id se define como tipo BSON::ObjectId.
El ejemplo anterior es equivalente al siguiente código, que pasa una instancia BSON::ObjectId como argumento a find:
Band.find(BSON::ObjectId.from_string('5f0e41d92c97a64a26aabd10'))
Si utiliza el controlador Ruby para realizar consultas en el campo _id, find no realiza internamente la conversión de tipo.
El método find acepta múltiples argumentos o una matriz de argumentos. Mongoid interpreta cada argumento o elemento de la matriz como un valor _id y devuelve documentos con todos los valores _id especificados en una matriz, como se muestra en el siguiente ejemplo:
# Equivalent ways to match multiple documents Band.find('5f0e41d92c97a64a26aabd10', '5f0e41b02c97a64a26aabd0e') Band.find(['5f0e41d92c97a64a26aabd10', '5f0e41b02c97a64a26aabd0e'])
El método find exhibe el siguiente comportamiento:
Si proporciona el mismo valor de
_idmás de una vez, Mongoid solo devuelve un documento, si existe uno.Mongoid no devuelve los documentos ordenados. Es posible que se devuelvan en un orden distinto al de los valores
_idproporcionados.Si alguno de los valores
_idno se encuentra en la base de datos, el resultado depende del valor de la opción de configuraciónraise_not_found_error.Si establece la opción
raise_not_found_errorentrue,findgenera un errorMongoid::Errors::DocumentNotFoundsi no se encuentra alguno de los valores_id.Si establece la opción
raise_not_found_errorenfalsey consulta un solo valor_id,finddevuelvenilsi Mongoid no coincide con ningún documento. Si pasa varios valores_idy algunos o ninguno coinciden, el valor de retorno es una matriz de los documentos que coinciden, o una matriz vacía si no hay ningún documento coincidente.
encontrar variaciones
Esta sección describe métodos similares al método find descrito en la sección anterior.
Puede usar el método find_by para recuperar documentos según los criterios proporcionados. Si no se encuentran documentos, se genera un error o se devuelve nil, según cómo configure la opción raise_not_found_error.
El siguiente código demuestra cómo utilizar el método find_by:
# Simple equality query Band.find_by(name: "Photek") # Performs an action on each returned result Band.find_by(name: "Tool") do |band| band.fans += 1 end
Puede usar el método find_or_create_by para recuperar documentos según los criterios proporcionados. Si no se encuentran documentos, se crea y devuelve una instancia que se guarda en MongoDB.
El siguiente código demuestra cómo utilizar el método find_or_create_by:
# If no matches, creates a Band with just the "name" field Band.find_or_create_by(name: "Photek") # If no matches, creates a Band with just the "name" field because the # query condition is not a literal Band.where(:likes.gt => 10).find_or_create_by(name: "Photek") # Creates a Band in which the name is Aerosmith because there is no # document in which "name" is Photek and Aerosmith at the same time Band.where(name: "Photek").find_or_create_by(name: "Aerosmith")
Se puede utilizar el método find_or_initialize_by para recuperar documentos basados en los criterios proporcionados. Si no se encuentran documentos, se devuelve uno nuevo, sin persistirlo en MongoDB. Use la misma sintaxis para find_or_initialize_by que se utiliza para el método find_or_create_by.
Expresiones regulares
Mongoid le permite consultar documentos utilizando expresiones regulares en sus criterios de filtro.
El siguiente código crea un modelo de muestra Band:
Band.create!(name: 'Tame Impala', description: "Tame\nImpala is an American band")
Puede realizar consultas utilizando expresiones regulares de Ruby, como se muestra en el siguiente código:
# Matches documents in which the "name" field includes the string "impala" Band.where(name: /impala/i) # => Returns sample document
También puedes realizar queries utilizando la sintaxis de Expresión Regular Compatible con Perl (PCRE) y objetos BSON::Regexp::Raw:
# Matches "description" values that start exactly with "Impala" Band.where(description: /\AImpala/) # => nil # Matches "description" values that start exactly with "Impala" Band.where(description: BSON::Regexp::Raw.new('^Impala')) # => nil # Matches "description" values that start exactly with "Impala" with # the multiline option Band.where(description: BSON::Regexp::Raw.new('^Impala', 'm')) # => Returns sample document
Conversiones de consultas de tipo de campo
Al especificar una query en un campo definido en un modelo, si el campo tiene un tipo de datos especificado, Mongoid convierte el valor de la query basado en cómo está definido el campo.
Considere la siguiente Album definición del modelo, que contiene un Datecampo con valor, un Timecampo con valor y un Objectcampo implícito con valor. El modelo tampoco define intencionalmente un campo last_reviewed llamado:
class Album include Mongoid::Document field :release_date, type: Date field :last_commented, type: Time field :last_purchased end
Puede realizar consultas en los campos release_date y last_commented utilizando los valores Date y Time, como se muestra en el siguiente código:
Album.where(release_date: Date.today) # Interpreted query: # {"release_date"=>2024-11-05 00:00:00 UTC} Album.where(last_commented: Time.now) # Interpreted query: # {"last_commented"=>2024-11-04 17:20:47.329472 UTC}
Sin embargo, si realiza consultas utilizando solo valores Date en campos definidos como otros tipos, las consultas generadas muestran el comportamiento de conversión predeterminado, como se muestra en el siguiente ejemplo:
Album.where(last_commented: Date.today) # Interpreted query: # {"last_commented"=>Mon, 04 Nov 2024 00:00:00.000000000 EST -05:00} Album.where(last_purchased: Date.today) # Interpreted query: # {"last_purchased"=>"2024-11-04"} Album.where(last_reviewed: Date.today) # Interpreted query: # {"last_reviewed"=>2024-11-04 00:00:00 UTC}
En el ejemplo anterior, se aplican las siguientes conversiones:
Al usar un
Datevalor para consultarTimelast_commentedel campo con valor, Mongoid interpreta que la fecha está en hora local y aplica la zona horaria configurada.Al realizar una consulta en el campo
last_purchased, que no tiene un tipo explícito, la fecha se utiliza sin modificaciones en la consulta construida.Al realizar una consulta en el campo indefinido
last_reviewed, Mongoid interpreta queDateestá en UTC y lo convierte a una hora, coincidiendo con el comportamiento de la consulta de un campo con valorDate, comorelease_date.
Métodos de query adicionales
Esta sección describe más métodos de consulta que puedes usar en Mongoid.
Contabilizar documentos
Puede usar los métodos count y estimated_count para contar la cantidad de documentos en una colección.
Puede contar la cantidad de documentos que coinciden con los criterios de filtro utilizando el método count:
# Counts all documents in collection Band.count # Counts documents that match criteria Band.where(country: 'England').count
Tip
Métodos de longitud y tamaño
También puede usar el método length o size para contar documentos. Estos métodos almacenan en caché las llamadas posteriores a la base de datos, lo que podría mejorar el rendimiento.
Puede obtener un número aproximado de documentos en la colección a partir de los metadatos de la colección utilizando el método estimated_count:
Band.estimated_count
El estimated_count método no acepta condiciones de consulta, incluidas las establecidas por un ámbito en el modelo. Si se llama a este método en un modelo con un ámbito predeterminado, primero se debe llamar al unscoped método para deshabilitarlo.
Métodos ordinales
Los métodos descritos en la siguiente lista le permiten seleccionar un resultado específico de la lista de documentos devueltos en función de su posición.
first: Devuelve el primer documento coincidente. Puede obtener los primerosndocumentos pasando un parámetro entero. Este método ordena automáticamente el campo. Consulte las_idlíneas 18 -del siguiente código para ver ejemplos.last: Devuelve el último documento coincidente. Puede obtener los últimosndocumentos pasando un parámetro entero. Este método ordena automáticamente el campo. Consulte la_idlínea 11 del siguiente código para ver un ejemplo.first_or_create: Devuelve el primer documento coincidente. Si no hay ningún documento coincidente, crea y devuelve uno nuevo guardado.first_or_initialize: Devuelve el primer documento coincidente. Si no hay ningún documento coincidente, devuelve uno nuevo.second: Retorna el segundo documento coincidente. Utiliza automáticamente una ordenación en el campo_id.third: Devuelve el tercer documento coincidente. Ordena automáticamente el campo_id.fourth: Devuelve el cuarto documento coincidente. Ordena automáticamente el campo_id.fifth: Devuelve el quinto documento coincidente. Ordena automáticamente el campo_id.second_to_last: Devuelve el penúltimo documento coincidente. Ordena automáticamente el campo. Consulte la_idlínea 14 del siguiente códigopara ver un ejemplo.third_to_last: Devuelve el antepenúltimo documento coincidente. Ordena automáticamente el campo_id.
El siguiente código demuestra cómo utilizar algunos métodos descritos en la lista anterior:
1 # Returns the first document in the collection 2 Band.first 3 4 # Returns the first matching document 5 Band.where(founded: {'$gt' => 1980}).first 6 7 # Returns the first two matching documents 8 Band.first(2) 9 10 # Returns the last matching document 11 Band.where(founded: {'$gt' => 1980}).last 12 13 # Returns the second to last document 14 Band.second_to_last
Tip
Generación de errores
Cada método descrito en esta sección tiene una variación con el sufijo ! que devuelve un error si Mongoid no encuentra ningún documento. Por ejemplo, para implementar la gestión de errores en su aplicación cuando su consulta no devuelve resultados, utilice el método first! en lugar de first.
Valores de los campos de la encuesta
Para inspeccionar los valores de campos específicos de documentos en una colección, puede utilizar los siguientes métodos:
distinctObtiene una lista de valores distintos para un solo campo. Consulte laslíneas 1-7 del siguiente código para ver ejemplos.pickObtiene los valores de un documento para los campos proporcionados. Devuelvenilpara los campos no definidos o inexistentes. Consulte la línea del siguiente código para ver un ejemplo.10pluckObtiene todos los valores del campo proporcionado. Devuelvenilpara campos no definidos o inexistentes. Consultela línea del siguiente código para ver un ejemplo.13tally: Obtiene un mapeo de valores a recuentos para el campo especificado. Consulta la línea 16 en el siguiente código como ejemplo.
Los métodos anteriores aceptan nombres de campo referenciados mediante notación de puntos, lo que permite referenciar campos en asociaciones incrustadas. También respetan los alias de campo, incluidos los definidos en documentos incrustados.
El siguiente código demuestra cómo utilizar estos métodos:
1 Band.distinct(:name) 2 # Example output: "Ghost Mountain" "Hello Goodbye" "She Said" 3 4 Band.where(:members.gt => 2).distinct(:name) 5 # Example output: "Arctic Monkeys" "The Smiths" 6 7 Band.distinct('tours.city') 8 # Example output: "London" "Sydney" "Amsterdam" 9 10 Band.all.pick(:name) 11 # Example output: "The Smiths" 12 13 Band.all.pluck(:country) 14 # Example output: "England" "Spain" "England" "Japan" 15 16 Band.all.tally(:country) 17 # Example output: ["England",2] ["Italy",3]
Misceláneo
La siguiente lista describe los métodos Mongoid que no encajan en otra categoría:
each: Itera sobre todos los documentos coincidentes.
# Print each matching document "name" to console Band.where(:members.gt => 1).each do |band| p band.name end
exists?: Determina si existen documentos coincidentes y devuelvetruesi se encuentra al menos un documento coincidente.
# Checks existence of any document Band.exists? # Checks existence based on query Band.where(name: "Le Tigre").exists? Band.exists?(name: "Le Tigre") # Checks existence based on "_id" value Band.exists?('6320d96a3282a48cfce9e72c') # Always returns false Band.exists?(false) Band.exists?(nil)
Información Adicional
Para aprender cómo modificar la forma en que Mongoid le devuelve resultados, consulte Modificar resultados de consulta.
Para obtener más información sobre cómo definir alcances en sus modelos, consulte Alcance.
Para obtener información sobre los métodos que puede encadenar a sus consultas para conservar datos, consulte Conservar datos desde consultas.
Para obtener más información sobre la función de caché de consultas, consulte Caché de consultas.
Para obtener más información sobre cómo realizar consultas asincrónicas, consulte Consultas asincrónicas.