Menu Docs

Configuração

O Mongoid é normalmente configurado por meio de um arquivo mongoid.yml que especifica opções e clientes. A configuração mais simples é a seguinte, que configura o Mongoid para se comunicar com um servidor MongoDB em "localhost:27017" e usar o banco de dados denominado "mongoid".

development:
clients:
default:
database: mongoid
hosts:
- localhost:27017

A chave de nível superior no arquivo de configuração, development no exemplo acima, refere-se ao nome de ambiente que o aplicativo está executando, isto é, development, test ou production. A chave de terceiro nível, default no exemplo acima, refere-se ao nome do cliente Mongo. A maioria dos aplicativos utilizará um único cliente denominado default.

Se você estiver usando Ruby on Rails, você pode fazer com que o Mongoid gere um arquivo de configuração padrão para você executando o seguinte comando:

rails g mongoid:config

O arquivo de configuração será colocado no config/mongoid.yml.

Se você não estiver utilizando Ruby on Rails, você poderá copiar a configuração mínima fornecida acima e salvá-la como config/mongoid.yml.

Se você estiver utilizando Ruby on Rails, a configuração Mongoid será carregada automaticamente para o ambiente atual como armazenado no Rails.env quando o aplicativo carregar.

Talvez seja necessário configurar o ORM para que seu aplicativo seja Mongoid adicionando o seguinte a application.rb:

config.generators do |g|
g.orm :mongoid
end

Se você não estiver usando Ruby on Rails, a configuração Mongoid deve ser carregada manualmente. Isto pode ser feito através do método Mongoid.load!, que utiliza o caminho do arquivo de configuração como seu argumento, como segue:

# Use automatically detected environment name
Mongoid.load!("path/to/your/mongoid.yml")
# Specify environment name manually
Mongoid.load!("path/to/your/mongoid.yml", :production)

Quando o Mongoid é solicitado a detectar automaticamente o nome do ambiente, ele o faz examinando as seguintes fontes, em ordem:

  • Se o Rails constante de nível superior for definido, Rails.env.

  • Se o Sinatra constante de nível superior for definido, Sinatra::Base.environment.

  • A variável de ambiente do RACK_ENV.

  • A variável de ambiente do MONGOID_ENV.

Também é possível configurar o Mongoid diretamente no Ruby, sem usar um arquivo de configuração. Esse estilo de configuração não é compatível com o conceito de ambientes - independentemente da configuração fornecida, ele é aplicado ao ambiente atual - mas é compatível com a definição de vários clientes.

Mongoid.configure do |config|
config.clients.default = {
hosts: ['localhost:27017'],
database: 'my_db',
}
config.log_level = :warn
end

Observação

O Mongoid deve ser configurado antes que qualquer componente dele seja usado ou referenciado. Depois que um componente é usado ou referenciado, a alteração da configuração pode não aplicar alterações aos componentes já instanciados.

O exemplo anotado mongoid.yml a seguir demonstra como o Mongoid pode ser configurado.

O Mongoid delega ao driver Ruby a configuração do cliente. Consulte a documentação do driver para obter detalhes sobre as opções disponíveis.

development:
# Configure available database clients. (required)
clients:
# Define the default client. (required)
default:
# A uri may be defined for a client:
# uri: 'mongodb://user:password@myhost1.mydomain.com:27017/my_db'
# Please see driver documentation for details. Alternatively, you can
# define the following:
#
# Define the name of the default database that Mongoid can connect to.
# (required).
database: my_db
# Provide the hosts the default client can connect to. Must be an array
# of host:port pairs. (required)
hosts:
- myhost1.mydomain.com:27017
- myhost2.mydomain.com:27017
- myhost3.mydomain.com:27017
options:
# These options are Ruby driver options, documented in
# https://mongodb.com/pt-br/docs/ruby-driver/current/reference/create-client/
# Change the default write concern. (default = { w: 1 })
write:
w: 1
# Change the default read preference. Valid options for mode are: :secondary,
# :secondary_preferred, :primary, :primary_preferred, :nearest
# (default: primary)
read:
mode: :secondary_preferred
tag_sets:
- use: web
# The name of the user for authentication.
user: 'user'
# The password of the user for authentication.
password: 'password'
# The user's database roles.
roles:
- 'dbOwner'
# Change the default authentication mechanism. Please see the
# driver documentation linked above for details on how to configure
# authentication. Valid options are :aws, :gssapi, :mongodb_cr,
# :mongodb_x509, :plain, :scram and :scram256 (default on 3.0
# and higher servers is :scram, default on 2.6 servers is :plain)
auth_mech: :scram
# Specify the auth source, i.e. the database or other source which
# contains the user's login credentials. Allowed values for auth source
# depend on the authentication mechanism, as explained in the server documentation:
# https://mongodb.com/pt-br/docs/manual/reference/connection-string/#mongodb-urioption-urioption.authSource
# If no auth source is specified, the default auth source as
# determined by the driver will be used. Please refer to:
# https://mongodb.com/pt-br/docs/ruby-driver/current/reference/authentication/#auth-source
auth_source: admin
# Connect directly to and perform all operations on the specified
# server, bypassing replica set node discovery and monitoring.
# Exactly one host address must be specified. (default: false)
#direct_connection: true
# Deprecated. Force the driver to connect in a specific way instead
# of automatically discovering the deployment type and connecting
# accordingly. To connect directly to a replica set node bypassing
# node discovery and monitoring, use direct_connection: true instead
# of this option. Possible values: :direct, :replica_set, :sharded.
# (default: none)
#connect: :direct
# Change the default time in seconds the server monitors refresh their status
# via hello commands. (default: 10)
heartbeat_frequency: 10
# The time in seconds for selecting servers for a near read preference. (default: 0.015)
local_threshold: 0.015
# The timeout in seconds for selecting a server for an operation. (default: 30)
server_selection_timeout: 30
# The maximum number of connections in the connection pool. (default: 5)
max_pool_size: 5
# The minimum number of connections in the connection pool. (default: 1)
min_pool_size: 1
# The time to wait, in seconds, in the connection pool for a connection
# to be checked in before timing out. (default: 1)
wait_queue_timeout: 1
# The time to wait to establish a connection before timing out, in seconds.
# (default: 10)
connect_timeout: 10
# How long to wait for a response for each operation sent to the
# server. This timeout should be set to a value larger than the
# processing time for the longest operation that will be executed
# by the application. Note that this is a client-side timeout;
# the server may continue executing an operation after the client
# aborts it with the SocketTimeout exception.
# (default: nil, meaning no timeout)
socket_timeout: 5
# The name of the replica set to connect to. Servers provided as seeds that do
# not belong to this replica set will be ignored.
replica_set: my_replica_set
# Whether to connect to the servers via ssl. (default: false)
ssl: true
# The certificate file used to identify the connection against MongoDB.
ssl_cert: /path/to/my.cert
# The private keyfile used to identify the connection against MongoDB.
# Note that even if the key is stored in the same file as the certificate,
# both need to be explicitly specified.
ssl_key: /path/to/my.key
# A passphrase for the private key.
ssl_key_pass_phrase: password
# Whether or not to do peer certification validation. (default: true)
ssl_verify: true
# The file containing a set of concatenated certification authority certifications
# used to validate certs passed from the other end of the connection.
ssl_ca_cert: /path/to/ca.cert
# Compressors to use. (default is to not use compression)
compressors: [zlib]
# Configure Mongoid-specific options. (optional)
options:
# Application name that is printed to the MongoDB logs upon establishing
# a connection in server versions 3.4 or greater. Note that the name
# cannot exceed 128 bytes in length. It is also used as the database name
# if the database name is not explicitly defined. (default: nil)
app_name: MyApplicationName
# Type of executor for queries scheduled using ``load_async`` method.
#
# There are two possible values for this option:
#
# - :immediate - Queries will be immediately executed on a current thread.
# This is the default option.
# - :global_thread_pool - Queries will be executed asynchronously in
# background using a thread pool.
#async_query_executor: :immediate
# Mark belongs_to associations as required by default, so that saving a
# model with a missing belongs_to association will trigger a validation
# error. (default: true)
belongs_to_required_by_default: true
# (Deprecated) Maintain broken behavior of sum over empty result sets for backwards
# compatibility. When calculating a sum on a field with a null context,
# for example:
#
# Product.none.sum(:price)
#
# ... return field name (`:price') instead of 0.
#
# When calculating a sum via a database query with an empty result set,
# for example:
#
# Product.where(impossible_condition: true).sum(:price)
#
# ... return nil instead of 0.
# (default: false)
#broken_aggregables: true
# (Deprecated) Ignore aliased fields in embedded documents when performing pluck and
# distinct operations, for backwards compatibility.
# (default: false)
#broken_alias_handling: true
# (Deprecated) Maintain broken `and' method behavior that existed in Mongoid 7.3
# and earlier for backwards compatibility: in some situations, conditions
# already present in a Criteria object would be replaced by newer
# conditions when `and' method is used instead of the new conditions
# being added to the existing conditions. This would happen when using
# the same operator on the same field multiple times. For example:
#
# Band.where(id: 1).and({year: {'$in' => [2020]}}, {year: {'$in' => [2021]}}).where(id: 2)
#
# yields the following criteria:
#
# <Mongoid::Criteria
# selector: {"_id"=>1, "year"=>{"$in"=>[2020]}, "$and"=>[{"_id"=>2}]}
# options: {}
# class: Band
# embedded: false>
#
# This is obviously incorrect as the {"$in"=>[2021]} clause is lost.
# Notice that the clause is only lost when both clauses are added using
# the #and method.
# (default: false)
#broken_and: true
# (Deprecated) When exiting a nested `with_scope' block, set the current scope to
# nil instead of the parent scope for backwards compatibility.
# (default: false)
#broken_scoping: true
# (Deprecated) Maintain broken update behavior in some cases for backwards
# compatibility.
#
# In Mongoid 7.3 and earlier, when assigning a value to an embedded
# document, then setting it to nil, then assigning the original value
# to it again, the second update would not work and the value for the
# embedded document would remain nil. Take this case:
#
# canvas.palette = palette
# canvas.palette = nil
# canvas.palette = palette
#
# ... where canvas embeds_one palette.
#
# In Mongoid 7.3 and earlier, canvas.palette would be nil when we would
# expect it to be palette. Set this option to true to keep this behavior,
# set the option to false to perform the second update correctly.
# (default: false)
#broken_updates: true
# (Deprecated) Time objects in Ruby have nanosecond precision, whereas MongoDB server
# can only store times with millisecond precision. Set this option to
# true to truncate times to millisecond precision when performing
# queries on already loaded embedded associations (this is also called
# "embedded matching" and is done completely in Ruby), to obtain the
# same query results when performing time comparisons regardless of
# which documents are being queried. Setting this option to false will
# produce different results for queries on embedded associations that
# are already loaded into memory vs queries on unloaded associations and
# top-level models. (default: true)
#compare_time_by_ms: false
# Set the global discriminator key. (default: "_type")
discriminator_key: "_type"
# Raise an exception when a field is redefined. (default: false)
duplicate_fields_exception: false
# Defines how many asynchronous queries can be executed concurrently.
# This option should be set only if `async_query_executor` option is set
# to `:global_thread_pool`.
#global_executor_concurrency: nil
# Include the root model name in json serialization. (default: false)
include_root_in_json: false
# Include the _type field in serialization. (default: false)
include_type_for_serialization: false
# Whether to join nested persistence contexts for atomic operations
# to parent contexts by default. (default: false)
join_contexts: false
# (Deprecated) When this flag is true, the attributes method on a document will return
# a BSON::Document when that document is retrieved from the database, and
# a Hash otherwise. When this flag is false, the attributes method will
# always return a Hash. (default: false)
#legacy_attributes: true
# (Deprecated) Maintain legacy behavior of pluck and distinct, which does not demongoize
# values on returning them. Setting this option to false will cause
# pluck and distinct to return demongoized values. Setting this option to
# false will also allow retrieving *_translations fields from pluck and
# distinct and will return embedded values themselves (i.e. without
# putting them in a hash).
# (default: false)
#legacy_pluck_distinct: true
# When this flag is false, a document will become read-only only once the
# #readonly! method is called, and an error will be raised on attempting
# to save or update such documents, instead of just on delete. When this
# flag is true, a document is only read-only if it has been projected
# using #only or #without, and read-only documents will not be
# deletable/destroyable, but will be savable/updatable.
# When this feature flag is turned on, the read-only state will be reset on
# reload, but when it is turned off, it won't be.
# (default: false)
#legacy_readonly: true
# (Deprecated) Maintain legacy behavior of === on Mongoid document classes, which
# returns true in a number of cases where Ruby's === implementation would
# return false. Note that the behavior of === on Mongoid document
# instances differs from both the behavior of === on document classes
# and from Ruby's behavior of === on simple object instances regardless
# of the value of this option.
# (default: false)
#legacy_triple_equals: true
# Set the Mongoid and Ruby driver log levels when Mongoid is not using
# Ruby on Rails logger instance. (default: :info)
log_level: :info
# When using the BigDecimal field type, store the value in the database
# as a BSON::Decimal128 instead of a string. (default: true)
#map_big_decimal_to_decimal128: true
# (Deprecated) Force ``BSON::ObjectId#as_json`` method to return the hash
# { "$oid" => id.to_s }. When this option is false, and bson-ruby 5
# is used, the return value will be the hexadecimal ObjectId string only.
# (default: false)
#object_id_as_json_oid: true
# (Deprecated) When chaining the same operators that use the same field, setting this
# feature flag to false will cause those operators to be combined using an
# and. Setting this feature flag to true will cause the later chained
# operators to overwrite the earlier ones. (default: false)
#overwrite_chained_operators: false
# Preload all models in development, needed when models use
# inheritance. (default: false)
preload_models: false
# Raise an error when performing a #find and the document is not found.
# (default: true)
raise_not_found_error: true
# Raise an error when defining a scope with the same name as an
# existing method. (default: false)
scope_overwrite_exception: false
# (Deprecated) Use ActiveSupport's time zone in time operations instead of
# the Ruby default time zone. See the time zone section below for
# further information. (default: true)
use_activesupport_time_zone: true
# Return stored times as UTC. See the time zone section below for
# further information. Most applications should not use this option.
# (default: false)
use_utc: false
# (Deprecated) In MongoDB 4.0 and earlier, set whether to create
# indexes in the background by default. (default: false)
background_indexing: false
# Configure driver-specific options. (optional)
driver_options:
# When this flag is turned off, inline options will be correctly
# propagated to Mongoid and Driver finder methods. When this flag is turned
# on those options will be ignored. For example, with this flag turned
# off, Band.all.limit(1).count will take the limit into account, while
# when this flag is turned on, that limit is ignored. The affected driver
# methods are: aggregate, count, count_documents, distinct, and
# estimated_document_count. The corresponding Mongoid methods are also
# affected. (default: false, driver version: 2.18.0+)
#broken_view_options: false
# Validates that there are no atomic operators (those that start with $)
# in the root of a replacement document, and that there are only atomic
# operators at the root of an update document. If this feature flag is on,
# an error will be raised on an invalid update or replacement document,
# if not, a warning will be output to the logs. This flag does not affect
# Mongoid as of 8.0, but will affect calls to driver update/replace
# methods. (default: false, driver version: 2.18.0+)
#validate_update_replace: false

O Mongoid suporta a definição das opções de configuração para os padrões de versões específicas. Isso é útil para atualizar para uma nova versão Mongoid. Ao atualizar sua versão Mongoid, o seguinte deve ser definido em Mongoid::Config:

Mongoid.configure do |config|
config.load_defaults <OLD VERSION>
end

Dessa forma, ao atualizar para uma nova versão do Mongoid, seu código será executado com as opções de configuração da versão anterior do Mongoid. Então, um a um, você pode alterar os sinalizadores de recursos para a nova versão e testar se o seu código ainda funciona conforme o esperado. Uma vez que todos os novos sinalizadores de recursos tenham sido contabilizados, a chamada para load_defaults pode ser alterada para incluir a nova versão, e todos os sinalizadores de recursos alterados podem ser removidos. Por exemplo, digamos que estamos atualizando de 7.5 para 8.0. Entre essas duas versões, apenas duas sinalizações de recurso foram adicionadas: legacy_attributes e map_big_decimal_to_decimal128. Antes de atualizar para Mongoid 8, a seguinte linha pode ser adicionada:

Mongoid.configure do |config|
config.load_defaults 7.5
end

Agora, após atualizar, estes dois sinalizadores de feição irão padronizar para sua funcionalidade do 7.5 (legacy_attributes: true, map_big_decimal_to_decimal128: false). Agora você pode definir esses sinalizadores de recursos um por um e alterá-los para o comportamento 8.0:

Mongoid.configure do |config|
config.load_defaults 7.5
config.legacy_attributes = false
# config.map_big_decimal_to_decimal128 = true
end

É aconselhável fazer isso um de cada vez, então deixei a segunda bandeira comentada. Depois de verificar se seu código funciona conforme o esperado com o sinalizador legacy_attributes desativado, a configuração map_big_decimal_to_decimal128 pode ser descomentada. Após esta funcionalidade ser verificada também, ambas as linhas podem ser removidas e o load_defaults substituído por:

Mongoid.configure do |config|
config.load_defaults 8.0
end

Ao carregar um arquivo de configuração, o Mongoid processa com ERb antes de analisá-lo como YAML. Isso permite, por exemplo, construir o conteúdo do arquivo de configuração no runtime baseado em variáveis de ambiente:

development:
clients:
default:
uri: "<%= ENV['MONGODB_URI'] %>"

Observação

Ao emitir valores de ERb, verifique se os valores são YAML válidos e escape-os conforme necessário.

Observação

Como a renderização de ERb é executada antes da análise de YAML, todas as diretivas ERb no arquivo de configuração são avaliadas, incluindo aquelas que ocorrem nos comentários de YAML.

Ao configurar o registro, é importante ter em mente que o Mongoid fornece uma camada de modelo sobre o driver Ruby do MongoDB, e o driver despacha as operações CRUD para o sistema do MongoDB. Portanto, parte da saída de registro em um aplicativo usando o Mongoid vem do próprio Mongoid e parte vem do driver.

O cliente Mongo é uma instância do cliente do driver Ruby, portanto, o registrador de um cliente Mongo é o registrador do driver Ruby, não o registrador do Mongoid. Em outras palavras:

# Ruby driver logger, not Mongoid logger
Mongoid.client(:default).logger

Dependendo se o Mongoid é usado em um aplicativo Ruby on Rails e como o driver Mongoid e Ruby são configurados, eles podem usar a mesma instância do registrador ou instâncias diferentes, potencialmente com configurações diferentes.

Quando usado em um aplicativo Ruby on Rails, o Mongoid, por padrão, herda o registrador e o nível de registro do Rails e define o registrador do driver para a mesma instância de registrador:

Rails.logger === Mongoid.logger
# => true
Mongoid.logger === Mongo::Logger.logger
# => true

Para alterar o nível do registro, use a configuração padrão do Rails. Coloque o seguinte em um dos arquivos de configuração do ambiente, como config/environments/production.rb:

Rails.application.configure do
config.log_level = :debug
end

Observação

A opção de configuração log_level do Mongoid não é usada quando o Mongoid opera em um aplicativo Rails, pois o Mongoid herda o nível de registro do Rails nesse caso.

Para configurar o Mongoid ou o registrador de driver de forma diferente do registrador do Rails, use um inicializador da seguinte maneira:

Rails.application.configure do
config.after_initialize do
# Change Mongoid log destination and/or level
Mongoid.logger = Logger.new(STDERR).tap do |logger|
logger.level = Logger::DEBUG
end
# Change driver log destination and/or level
Mongo::Logger.logger = Logger.new(STDERR).tap do |logger|
logger.level = Logger::DEBUG
end
end
end

Observação

Atualmente, não há provisão na biblioteca padrão Ruby Logger para retornar o dispositivo de registro (ou seja, o objeto IO) que um registrador está usando. Ter, por exemplo, o Mongoid e/ou o driver Ruby logando no arquivo de registro padrão do Rails (por exemplo. log/development.log), mas com um nível diferente do registrador Rails padrão (Rails.logger), o arquivo deve ser aberto separadamente e o objeto IO resultante deve ser passado para o construtor Logger.

Observação

Como por padrão, o Mongoid define seu próprio registrador e o registrador do driver para a mesma instância que o registrador do Rails, modificar qualquer uma das instâncias afeta todas elas. Por exemplo, o nível de registro de alterações a seguir para todos os três registradores, a menos que o aplicativo tenha atribuído uma instância Logger separada a Mongo::Logger.logger conforme descrito acima:

Mongoid::Logger.logger.level = Logger::DEBUG

When not loaded in a Ruby on Rails application, Mongoid respects the log_level top level configuration option. Ele pode ser fornecido no arquivo de configuração da seguinte maneira:

development:
clients:
default:
# ...
options:
log_level: :debug

... ou ao configurar a linha Mongoid:

Mongoid.configure do |config|
config.log_level = :debug
end

O destino de registro padrão no Mongoid 7.1 e superior é de erro padrão. O destino de registro padrão no Mongoid 7.0 e inferior é de saída padrão. Para alterar o destino do registro, crie uma nova instância de registrador da seguinte maneira:

Mongoid.logger = Logger.new(STDERR).tap do |logger|
logger.level = Logger::DEBUG
end

Para alterar o nível de registo do driver ou destino Ruby:

Mongo::Logger.logger = Logger.new(STDERR).tap do |logger|
logger.level = Logger::DEBUG
end

Para definir o registrador do driver para ser igual ao registrador Mongoid:

Mongo::Logger.logger = Mongoid.logger

Observação

O Mongoid não altera o registrador do driver quando executado no modo standalone.

Ruby tem suporte limitado a fuso horário na biblioteca padrão. ActiveSupport (do qual o Mongoid depende) oferece suporte de fuso horário mais abrangente. É importante ressaltar que Ruby e ActiveSupport podem ser configurados com fusos horários padrão diferentes.

Embora um tratamento completo dos fusos horários em Ruby esteja fora do escopo deste tutorial, a maneira mais fácil e confiável de obter o tratamento correto do fuso horário é a seguinte:

  1. Configure o fuso horário do sistema operacional para UTC. Por exemplo, no Linux:

cp /usr/share/zoneinfo/UTC /etc/localtime
  1. Definir fuso horário do ActiveSupport para UTC:

# If using Rails, in application.rb:
class Application < Rails::Application
config.time_zone = 'UTC'
end
# If not using Rails:
Time.zone = 'UTC'
  1. Armazene e persista o tempo todo em UTC. Execute todos os cálculos em horários UTC.

  2. Ao trabalhar com a entrada de usuários em um fuso horário local, converta a entrada do usuário em horários UTC o mais rápido possível e, em seguida, use o fuso horário UTC.

  3. Ao renderizar ou apresentar horários, converta-os para o horário local depois de fazer todos os cálculos, quando a renderização for de fato realizada.

  4. As conversões de data para hora (por exemplo, a hora em que um determinado dia começa ou termina) são uma fonte comum de erros. Em geral, essas conversões devem ser realizadas especificando explicitamente o fuso horário em que a data é entendida.

Os aplicativos que usam o Mongoid geralmente devem configurar o fuso horário do ActiveSupport conforme descrito acima e, em seguida, usar Time.zone em vez de Time (por exemplo, Time.zone.now em vez de Time.now) para invocar o mecanismo de fuso horário do ActiveSupport. Isso também ajuda a alcançar os resultados corretos quando o fuso horário do sistema não é UTC, como é comum em ambientes de desenvolvimento.

Observe que o MongoDB armazena todos os horários em UTC sem informações de fuso horário.

O Mongoid oferece as seguintes opções de configuração relacionadas ao fuso horário:

  • use_activesupport_time_zone: Esta opção é preterida e será removida na Mongoid 9.0, sempre se comportando como verdadeiro.

    Se verdadeiro (padrão), recomendamos trabalhar com horários utilizando ActiveSupport::TimeWithZone. Os valores nos campos do tipo Time serão gerados como instâncias do ActiveSupport::TimeWithZone. Ao analisar horários sem informações de fuso horário (como ao mongoizar strings ou arrays no horário), presuma que os horários estejam especificados no fuso horário do ActiveSupport. Este é o padrão.

    Se for falso, prefira trabalhar com horários usando a classe Time da biblioteca padrão Ruby. Os valores nos campos do tipo Time serão retornados como Time instâncias. Ao analisar horários sem informações de fuso horário, suponha que os horários estejam especificados no fuso horário Ruby.

    Note que a configuração use_activesupport_time_zone não afeta os campos dos tipos Date ou DateTime, que utilizam classes Date e DateTime para seus valores, respectivamente.

    Observe também que o Mongoid ainda pode utilizar as classes Time e ActiveSupport::TimeWithZone internamente, conforme apropriado, independentemente da configuração use_activesupport_time_zone.

  • use_utc: Se verdadeiro, os horários armazenados no MongoDB serão devolvidos em UTC. Se falso, os horários armazenados no MongoDB serão retornados no horário local (como instâncias do Time ou ActiveSupport::TimeWithZone, respectivamente no fuso horário padrão Ruby ou no fuso horário ActiveSupport, com base no valor da configuração do use_activesupport_time_zone). O padrão é falso.

    A configuração use_utc não afeta como as horas são analisadas - a análise é sempre feita na hora local, quando a entrada que está sendo analisada não inclui informações de fuso horário. Para analisar datas em UTC, defina o fuso horário do sistema/Ruby ou ActiveSupport como UTC (como mencionado acima, definir todos os três como UTC leva ao menor número de dores de cabeça).

    Recomenda-se definir use_activesupport_time_zone como true e Time.zone como UTC (e usar o mecanismo de tempo do ActiveSupport para todas as operações relacionadas a tempo) em vez de definir use_utc como true.

Observe que as opções use_activesupport_time_zone e use_utc não descartam informações de fuso horário quando elas estão disponíveis. Por exemplo, uma instância de horário tem um fuso horário associado, e esse fuso horário será usado mesmo que seja diferente do fuso horário configurado do ActiveSupport quando use_activesupport_time_zone for verdadeiro.

Pode ser desejável configurar ainda mais as opções de TLS em seu aplicativo, por exemplo, ativando ou desativando determinadas cifras.

Isso pode ser feito definindo os ganchos de contexto TLS no driver Ruby - os ganchos de contexto TLS são objetos Proc``s that will be invoked before any TLS socket connection in the driver and can be used to modify the underlying ``OpenSSL::SSL::SSLContext fornecidos pelo usuário e usados pelo soquete.

Para definir ganchos de contexto TLS, adicione a array Proc``s to the ``Mongo.tls_context_hooks. Isso pode ser feito em um inicializador. O exemplo abaixo adiciona um gancho que habilita apenas a cifra "AES256-SHA".

Mongo.tls_context_hooks.push(
Proc.new { |context|
context.ciphers = ["AES256-SHA"]
}
)
# Only the AES256-SHA cipher will be enabled from this point forward

Cada Proc em Mongo.tls_context_hooks passará um objeto OpenSSL::SSL::SSLContext como seu único argumento. Esses procs serão executados sequencialmente durante a criação de soquete.

Aviso

Os hooks de contexto TLS são globais e afetarão todas as instâncias Mongo::Client em um aplicativo.

Para obter mais informações sobre os hooks de contexto TLS, incluindo as práticas recomendadas para atribuí-los e removê-los, consulte a documentação do driver Ruby.

Ao carregar o arquivo de configuração, o Mongoid permitirá que o arquivo contenha instâncias BSON::Binary utilizadas para especificar o keyId no mapa de esquema para a criptografia do lado do cliente, como o seguinte exemplo demonstra:

development:
clients:
default:
database: blog_development
hosts: [localhost:27017]
options:
auto_encryption_options:
key_vault_namespace: 'keyvault.datakeys'
kms_providers:
local:
key: "z7iYiYKLuYymEWtk4kfny1ESBwwFdA58qMqff96A8ghiOcIK75lJGPUIocku8LOFjQuEgeIP4xlln3s7r93FV9J5sAE7zg8U"
schema_map:
blog_development.comments:
properties:
message:
encrypt:
keyId:
- !ruby/object:BSON::Binary
data: !binary |-
R/AgNcxASFiiJWKXqWGo5w==
type: :uuid
bsonType: "string"
algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
bsonType: "object"

Ao usar o Mongoid com um servidor web de bifurcação, como Puma, Unicorn ou Passenger, recomenda-se não realizar nenhuma operação em modelos Mongoid no processo principal antes do fork.

Quando um processo bifurca, os threads Ruby não são transferidos para os processos filho e os objetos Client do driver Ruby perdem seu monitoramento em segundo plano. Normalmente, o aplicativo parece funcionar bem até que o estado de sistema seja alterado (por exemplo, devido a erros de rede, um evento de manutenção), momento em que o aplicativo provavelmente começará a obter NoServerAvailable exceção ao executar operações do MongoDB.

Se o processo principal precisar executar operações no banco de dados do MongoDB, redefina todos os clientes nos trabalhadores após a bifurcação. Como fazer isso depende do servidor web que está sendo usado.

Se o processo principal não precisar executar operações no banco de dados do MongoDB depois que os processos filho forem bifurcados, feche os clientes no pai antes de forjar filhos. Se o processo pai executar operações em um cliente Mongo e não fechá-lo, o processo pai continuará consumindo um slot de conexão no cluster e continuará monitorando o cluster enquanto o pai permanecer vivo.

Observação

O padrão de fecho/reconexão descrito aqui deve ser usado com o driver Ruby versão 2.6.2 ou superior. Versões anteriores do driver não recriaram threads de monitoramento ao reconectar.

Use o gancho on_worker_boot para reconectar clientes nos trabalhadores e o gancho before_fork para fechar clientes no processo pai (Documentação Puma):

on_worker_boot do
if defined?(Mongoid)
Mongoid::Clients.clients.each do |name, client|
client.close
client.reconnect
end
else
raise "Mongoid is not loaded. You may have forgotten to enable app preloading."
end
end
before_fork do
if defined?(Mongoid)
Mongoid.disconnect_clients
end
end

Use o hook de after_fork para reconectar clientes nos funcionários, e o hook de before_fork para fechar clientes no processo principal (documentação Unicorn):

after_fork do |server, worker|
if defined?(Mongoid)
Mongoid::Clients.clients.each do |name, client|
client.close
client.reconnect
end
else
raise "Mongoid is not loaded. You may have forgotten to enable app preloading."
end
end
before_fork do |server, worker|
if defined?(Mongoid)
Mongoid.disconnect_clients
end
end

Use o hook de starting_worker_process para reconectar clientes nos funcionários (documentação de Passageiro). O Passageiro parece não ter um hook invocado no processo principal antes da bifurcação dos funcionários.

if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked
Mongoid::Clients.clients.each do |name, client|
client.close
client.reconnect
end
end
end
end

Observação

Quando usado com a versão 2.15 do driver Ruby ou mais recente, o Query Cache Middleware da Mongoid delega para o Query Cache Middleware do driver.

O Mongoid fornece um middleware de Rack que habilita oCache de Query do para a duração de cada solicitação da web. Abaixo está um exemplo de como habilitar o Query Cache Middleware em uma aplicação Ruby on Rails:

# config/application.rb
# Add Mongoid::QueryCache::Middleware at the bottom of the middleware stack
# or before other middleware that queries MongoDB.
config.middleware.use Mongoid::QueryCache::Middleware

Consulte o guia Rails on Rack para obter mais informações sobre como usar o middleware Rack em aplicativos Rails.

A configuração padrão do impulsionador é adequada para o sistema de produção. Em desenvolvimento, algumas configurações podem ser ajustadas para proporcionar uma melhor experiência ao desenvolvedor.

  • :server_selection_timeout: defina isso como um valor baixo (por exemplo, 1) se o servidor MongoDB estiver sendo executado localmente e você o iniciar manualmente. Um tempo limite de seleção de servidor baixo fará com que o driver falhe rapidamente quando não houver nenhum servidor em execução.

Exemplo de configuração de desenvolvimento recomendada:

development:
clients:
default:
database: mongoid
hosts:
- localhost:27017
options:
server_selection_timeout: 1