Overview
En esta guía, puede aprender cómo Mongoid guarda datos en su base de datos y colecciones. La Configuración de persistencia se refiere a la configuración que controla cómo Mongoid almacena 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 tales como las preferencias de lectura y guardado. Esta guía proporciona métodos y ejemplos que se pueden utilizar 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 utilizan un único cliente llamado default.
Nombre de colección por defecto
Por defecto, Mongoid almacena documentos en una colección cuyo nombre es la forma pluraleada del nombre de su clase representativa. En el siguiente ejemplo, para la clase Restaurant, la colección correspondiente se denomina 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 de pluralización por defecto no siempre funcionan. Por ejemplo, supongamos que tu modelo se llama Rey. La forma plural de esta palabra en español es reyes, pero el nombre de colección por defecto es reys.
Se puede crear una nueva regla de pluralización para la clase de modelo llamando al
ActiveSupport::Inflector::Inflections.plural Instancia el método y pasa las formas singular y plural del nombre de tu clase. El siguiente ejemplo especifica reyes como el plural de rey:
ActiveSupport::Inflector.inflections do |inflect| inflect.plural("rey", "reyes") end
Como resultado, Mongoid almacena los documentos de la clase de modelo Rey en la colección reyes.
Nota
Estructura de documentos 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 puedes utilizar para recuperar información sobre dónde Mongoid conserva el modelo:
client_nameRecupera el nombre del clientedatabase_name: Recuperar 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 persisten 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 proporciona opciones tanto a nivel de modelo como en tiempo de ejecución para personalizar tu configuración de persistencia. Las siguientes secciones describen estas opciones.
Opciones de persistencia a nivel de modelo
Supongamos que quieres almacenar los documentos de tu modelo en una colección con un nombre diferente al pluralizado del nombre de la clase del modelo. Se puede usar la macro store_in para cambiar la colección, base de datos o cliente donde Mongoid almacena los documentos de un modelo. El siguiente ejemplo muestra cómo utilizar 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ías querer utilizar este patrón en una aplicación multiusuario, donde varios usuarios comparten acceso común a una aplicación. Mediante el uso de una lambda, puedes definir un contexto de persistencia basado en información que sea local para el hilo actual, de modo que los usuarios no puedan acceder a los datos de otros.
El siguiente ejemplo almacena los documentos en una base de datos determinada por una variable local para subprocesos:
class Band include Mongoid::Document store_in database: ->{ Thread.current[:database] } end
Opciones de persistencia en tiempo de ejecución
Puedes usar el método with en una clase de modelo o instancia para cambiar la configuración de persistencia de un modelo para un grupo de operaciones durante tiempo de ejecución.
Llama al método with en una clase de modelo o una instancia y pasa opciones que definan el contexto de persistencia. Puedes llamar al método with de dos formas:
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, utiliza un bloque para definir las operaciones que deseas ejecutar en el contexto especificado. El contexto que defines únicamente existe mientras el código en el bloque se ejecuta.
Por defecto, Mongoid almacena los documentos para 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, debes definir el clúster tertiary bajo clients en tu archivo mongoid.yml.
Importante
Alcance de bloque
Debes llamar al método with con un bloque. Esto se debe a que Mongoid utiliza las opciones que pasas al método 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 puedes pasar las opciones de configuración del método with para las operaciones de lectura o escritura. Las configuraciones solo se aplican 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
Asegurar la coherencia en los contextos
Cuando se realiza una operación en un contexto, Mongoid no ejecuta automáticamente la misma operación en diferentes contextos. Por ejemplo, si insertas un documento de modelo Band en la colección artists, el mismo documento no se insertará en la colección bands.
Contextos de persistencia globales
En los ejemplos anteriores de esta sección, sólo ha cambiado el contexto de persistencia dentro del alcance de un bloque. Puedes utilizar Mongoid para definir globalmente un contexto de persistencia personalizado que todas las operaciones de tu programa utilicen. Esto te permite cambiar el contexto de persistencia para todas las operaciones en tiempo de ejecución sin llamar repetidamente al método with.
Puedes utilizar los siguientes métodos para definir globalmente el contexto de persistencia en tu programa:
Mongoid.override_client: Mongoid realiza todas las operaciones en el cliente especificado.Mongoid.override_databaseMongoid 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 localizaciones en diferentes bases de datos. El código muestra cómo usar el método Mongoid.override_database para configurar globalmente el contexto de persistencia basado en la localización:
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 en esta secuencia en una base de datos alternativa determinada por la localización. Como la macro after_action establece la opción de anulación en nil, las solicitudes posteriores sin modificaciones en la configuración de persistencia utilizan la configuración predeterminada.
Acceso a clientes y colecciones
Puedes acceder al cliente o a la colección de una instancia de modelo o documento utilizando los métodos de clase mongo_client y collection:
Band.mongo_client band.mongo_client Band.collection band.collection
Al usar estos métodos, también puedes establecer las opciones de persistencia en tiempo de ejecución llamando al método with, similar a los ejemplos de 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. Luego utiliza el método with en el cliente para guardar en la base de datos music, estableciendo la opción de guardar w en 0 para que no requiera el acuse de recibo de guardar.
Band.mongo_client.with(write: { w: 0 }, database: "music") do |client| client[:artists].find(...) end
collection.with
Puedes anular las opciones :read y :write en una colección utilizando el método with. El siguiente ejemplo muestra cómo utilizar 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 la API: