Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

Configuración de persistencia

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.

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.

Puede crear una nueva regla de pluralización para su clase de modelo llamando a la ActiveSupport::Inflector::Inflexiones.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 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"
}
]
}

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 cliente

  • database_name: Recuperar el nombre de la base de datos

  • collection_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

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.

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 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

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)context es una instancia de Mongoid::PersistenceContext y options es un Hash que representa un conjunto personalizable de opciones.

  • with(options)options es 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, debes definir el clúster tertiary bajo clients en tu 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 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

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.

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.

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 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.

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

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

Para obtener más información sobre los métodos mencionados en esta guía, consulte la siguiente documentación de la API:

Volver

Configuración de la colección

En esta página