Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Configuración de persistencia

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.

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"
}
]
}

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

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

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

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

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

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