Overview
En esta guía, aprenderá cómo Mongoid persiste los datos en su base de datos y colecciones. Laconfiguración de persistencia se refiere a los ajustes que controlan cómo Mongoid almacena los datos en MongoDB. Esto incluye el cliente, la base de datos y la colección donde se almacenan los documentos de una clase de modelo, así como otras opciones de configuración como las preferencias de lectura y escritura. Esta guía proporciona métodos y ejemplos que puede usar para acceder y actualizar la configuración de persistencia de una clase de modelo.
Nota
El término "cliente" se refiere a una configuración de host definida en
clients en su archivo mongoid.yml. La mayoría de las aplicaciones usan un solo cliente llamado default.
Nombre de colección predeterminado
De forma predeterminada, Mongoid almacena los documentos en una colección cuyo nombre es la forma pluralizada del nombre de la clase que la representa. En el siguiente ejemplo, para la clase Restaurant, la colección correspondiente se llama restaurants. Para la clase Person, la colección correspondiente se llama people.
class Restaurant include Mongoid::Document end class Person include Mongoid::Document end
Sin embargo, las reglas predeterminadas de pluralización no siempre funcionan. Por ejemplo, supongamos que su modelo se llama Rey. El plural de esta palabra en español es reyes, pero el nombre predeterminado de la colección es reys.
Puede crear una nueva regla de pluralización para su clase de modelo llamando a la
ActiveSupport::Inflector::Inflexiones.pluralMétodo de instancia y pasando las formas singular y plural del nombre de la clase. El siguiente ejemplo especifica reyes como plural rey de:
ActiveSupport::Inflector.inflections do |inflect| inflect.plural("rey", "reyes") end
Como resultado, Mongoid almacena Rey documentos de clase de modelo en la colección reyes.
Nota
Estructura del documento BSON
Cuando Mongoid almacena un documento en una base de datos, serializa el objeto Ruby en un documento BSON que tiene la siguiente estructura:
{ "_id" : ObjectId("4d3ed089fb60ab534684b7e9"), "title" : "Sir", "name" : { "_id" : ObjectId("4d3ed089fb60ab534684b7ff"), "first_name" : "Durran" }, "addresses" : [ { "_id" : ObjectId("4d3ed089fb60ab534684b7e0"), "city" : "Berlin", "country" : "Deutschland" } ] }
Atributos de contexto de persistencia
Cada clase de modelo contiene los siguientes métodos, que puede utilizar para recuperar información sobre dónde Mongoid persiste el modelo:
client_name:Recupera el nombre del clientedatabase_name:Recupera el nombre de la base de datoscollection_name:Recupera el nombre de la colección
El siguiente ejemplo muestra cómo recuperar e imprimir los nombres del cliente, la base de datos y la colección donde se conservan los documentos de la clase Band:
puts Band.client_name puts Band.database_name puts Band.collection_name
default my_bands bands
Personalice su configuración de persistencia
Mongoid ofrece opciones tanto a nivel de modelo como en tiempo de ejecución para personalizar la configuración de persistencia. Las siguientes secciones describen estas opciones.
Opciones de persistencia a nivel de modelo
Supongamos que desea almacenar los documentos de su modelo en una colección con un nombre distinto al plural de la clase del modelo. Puede usar la macro store_in para cambiar la colección, la base de datos o el cliente donde Mongoid almacena los documentos de un modelo. El siguiente ejemplo muestra cómo usar la macro store_in para almacenar documentos de la clase Person en una colección llamada citizens en la base de datos other dentro de un cliente llamado analytics:
class Person include Mongoid::Document store_in collection: "citizens", database: "other", client: "analytics" end
La macro store_in también puede aceptar una función lambda. Esto resulta útil si desea definir un contexto de persistencia con valores que no puedan usar una string constante.
Podría ser útil usar este patrón en una aplicación multiusuario, donde varios usuarios comparten acceso a una aplicación. Mediante una expresión lambda, se puede definir un contexto de persistencia basado en información local del hilo actual, de modo que los usuarios no puedan acceder a los datos de los demás.
El siguiente ejemplo almacena documentos en una base de datos determinada por una variable local del hilo:
class Band include Mongoid::Document store_in database: ->{ Thread.current[:database] } end
Opciones de persistencia en tiempo de ejecución
Puede utilizar el método with en una clase o instancia de modelo para cambiar la configuración de persistencia de un modelo para un grupo de operaciones durante el tiempo de ejecución.
Invoque el método with en una clase o instancia de modelo y pase opciones que definan un contexto de persistencia. Puede invocar el método with de dos maneras:
with(context, options):contextes una instancia deMongoid::PersistenceContextyoptionses un hash que representa un conjunto personalizable de opciones.with(options):optionses un hash que representa un conjunto personalizable de opciones.
Luego, use un bloque para definir las operaciones que desea ejecutar en el contexto especificado. El contexto definido solo existe mientras se ejecuta el código del bloque.
De forma predeterminada, Mongoid almacena los documentos de la clase Band en una colección llamada bands. El siguiente ejemplo de código utiliza el método with para usar temporalmente un cliente, una base de datos y una colección diferentes para realizar operaciones en los documentos de la clase Band:
class Band include Mongoid::Document field :name, type: String field :likes, type: Integer end # Creates document in 'bands' collection in 'music-non-stop' database within # default cluster Band.with(database: "music-non-stop") do |band_class| band_class.create(name: "Medusa and the Polyps") end # Deletes all documents in 'artists' collection within default database Band.with(collection: "artists") do |band_class| band_class.delete_all end band = Band.new(name: "Japanese Breakfast") # Perform operations on tertiary cluster band.with(client: :tertiary) do |band_object| band_object.save! band.save! end
Nota
Definir clientes
En el ejemplo anterior, debe definir el clúster tertiary bajo clients en su archivo mongoid.yml.
Importante
Ámbito de bloque
Debes llamar al método with con un bloque. Esto se debe a que Mongoid usa las opciones que le pasas para crear un nuevo cliente en segundo plano. Un bloque define el alcance de este cliente para que pueda cerrarse y liberar sus recursos.
También puede pasar las opciones de configuración del método with para operaciones de lectura o escritura. Las configuraciones se aplican únicamente al tipo de operación especificado.
El siguiente ejemplo utiliza el método with para especificar el uso del nodo secundario para todas las operaciones de lectura dentro del bloque.
Band.with(read: {mode: :secondary}) do Band.count # This write operation runs in the # new persistence context, but is # not affected by the read preference. Band.create(name: "Metallica") end
Nota
Garantizar la coherencia en los contextos
Al realizar una operación en un contexto, Mongoid no la ejecuta automáticamente en contextos diferentes. Por ejemplo, si inserta un documento de modelo Band en la colección artists, no se insertará en la colección bands.
Contextos de persistencia global
En ejemplos anteriores de esta sección, solo modificó el contexto de persistencia en el ámbito de un bloque. Puede usar Mongoid para definir globalmente un contexto de persistencia personalizado que utilicen todas las operaciones de su programa. Esto le permite cambiar el contexto de persistencia para todas las operaciones en tiempo de ejecución sin tener que llamar repetidamente al método with.
Puede utilizar los siguientes métodos para definir globalmente el contexto de persistencia en su programa:
Mongoid.override_client:Mongoid realiza todas las operaciones en el cliente especificado.Mongoid.override_database:Mongoid realiza todas las operaciones en la base de datos especificada.
En el siguiente ejemplo de código, la aplicación almacena información para diferentes configuraciones regionales en distintas bases de datos. El código muestra cómo usar el método Mongoid.override_database para establecer globalmente el contexto de persistencia según la configuración regional:
class BandsController < ApplicationController before_action :switch_database after_action :reset_database private def switch_database I18n.locale = params[:locale] || I18n.default_locale Mongoid.override_database("my_db_name_#{I18n.locale}") end def reset_database Mongoid.override_database(nil) end end
En el ejemplo anterior, Mongoid realiza todas las demás operaciones de este hilo en una base de datos alternativa determinada por la configuración regional. Dado que la macro after_action establece la opción de anulación en nil, las solicitudes posteriores sin cambios en la configuración de persistencia utilizan la configuración predeterminada.
Acceso a clientes y colecciones
Puede acceder al cliente o a la colección de una instancia de modelo o documento mediante los métodos de clase mongo_client y collection:
Band.mongo_client band.mongo_client Band.collection band.collection
Al utilizar estos métodos, también puede establecer opciones de persistencia en tiempo de ejecución llamando al with método, similar a los ejemplos en la sección Opciones de persistencia en tiempo de ejecución.
mongo_client.with
El siguiente ejemplo de código accede al cliente utilizado por la clase de modelo Band. A continuación, utiliza el método with del cliente para escribir en la base de datos music, estableciendo la opción de escritura w en 0 para no requerir confirmación de escritura.
Band.mongo_client.with(write: { w: 0 }, database: "music") do |client| client[:artists].find(...) end
collection.with
Puede anular las opciones :read y :write en una colección mediante el método with. El siguiente ejemplo muestra cómo usar el método with para establecer la opción de escritura w en 0:
Band.collection.with(write: { w: 0 }) do |collection| collection[:artists].find(...) end
Documentación de la API
Para obtener más información sobre los métodos mencionados en esta guía, consulte la siguiente documentación de API: