Configuration¶
On this page
Mongoid is customarily configured through a mongoid.yml
file that specifies
options and clients. The simplest configuration is as follows, which configures
Mongoid to talk to a MongoDB server at “localhost:27017” and use the database
named “mongoid”.
The top level key in the configuration file, development
in the above
example, refers to the environment name which the application is executing in,
i.e. development
, test
or production
. The third level key,
default
in the above example, refers to the Mongo client name.
Most applications will use a single client named default
.
Generating Default Configuration¶
If you are using Ruby on Rails, you can have Mongoid generate a default configuration file for you by running the following command:
The configuration file will be placed in config/mongoid.yml
.
If you are not using Ruby on Rails, you can copy the minimal configuration
given above and save it as config/mongoid.yml
.
Loading Mongoid Configuration¶
If you are using Ruby on Rails, Mongoid configuration is automatically loaded
for the current environment as stored in Rails.env
when the application
loads.
You may need to configure the ORM for your application to be Mongoid by
adding the following to application.rb
:
If you are not using Ruby on Rails, Mongoid configuration must be loaded
manually. This can be done via the Mongoid.load!
method, which takes
the configuration file path as its argument, as follows:
When Mongoid is asked to automatically detect the environment name, it does so by examining the following sources, in order:
- If
Rails
top level constant is defined,Rails.env
. - If
Sinatra
top level constant is defined,Sinatra::Base.environment
. - The
RACK_ENV
environment variable. - The
MONGOID_ENV
environment variable.
It is also possible to configure Mongoid directly in Ruby, without using a configuration file. This configuration style does not support the concept of environments - whatever configuration is provided, it is applied to the current environment - but it does support defining multiple clients.
Note
Mongoid must be configured before any component of it is used or referenced. Once a component is used or referenced, changing configuration may not apply changes to already instantiated components.
Mongoid Configuration¶
The following annotated example mongoid.yml
demonstrates how Mongoid
can be configured.
The Ruby driver options may be found in the driver documentation.
ERb Preprocessing¶
When loading a configuration file, Mongoid processes it with ERb before parsing it as YAML. This allows, for example, constructing the contents of the configuration file at runtime based on environment variables:
Note
When outputting values from ERb, ensure the values are valid YAML and escape them as needed.
Note
Since ERb rendering is performed prior to YAML parsing, all ERb directives in the configuration file are evaluated, including those occurring in YAML comments.
Logging¶
When configuring logging, it is important to keep in mind that Mongoid provides a model layer on top of the MongoDB Ruby driver, and the driver dispatches the CRUD operations to the MongoDB deployment. Therefore, some of the logging output in an application using Mongoid comes from Mongoid itself, and some comes from the driver.
The Mongo client is a Ruby driver client instance, therefore the logger of a Mongo client is the Ruby driver logger, not the Mongoid logger. In other words:
Depending on whether Mongoid is used in a Ruby on Rails application, and how both Mongoid and Ruby driver are configured, they may use the same logger instance or different instances, potentially with different configurations.
In Ruby on Rails Application¶
When used in a Ruby on Rails application, Mongoid by default inherits the logger and the log level from Rails, and sets the driver’s logger to the same logger instance:
To change the log level, use standard Rails configuration.
Place the following in one of environment configuration files, such as
config/environments/production.rb
:
Note
The log_level
Mongoid configuration option
is not used when Mongoid operates in a Rails application, because Mongoid
inherits Rails’ log level in this case.
To configure either Mongoid or driver logger differently from the Rails logger, use an initializer as follows:
Note
There is currently no provision in the Ruby standard library Logger
to return the log device (i.e. the IO
object) that a logger is using.
To have, for example, Mongoid and/or the Ruby driver log to the
standard Rails log file (e.g. log/development.log
) but with a
different level from standard Rails logger (Rails.logger
), the
file must be opened separately and the resulting IO
object passed to
the Logger
constructor.
Note
Since by default Mongoid sets its own logger and the driver’s logger to the
same instance as the Rails logger, modifying any of the instances affects
all of them. For example the following changes log level for all three
loggers, unless the application assigned a separate Logger
instance
to Mongo::Logger.logger` as described above:
Standalone¶
When not loaded in a Ruby on Rails application, Mongoid respects the
log_level
top level configuration option.
It can be given in the configuration file as follows:
… or when configuring Mongoid inline:
The default log destination in Mongoid 7.1 and higher is standard error. The default log destination in Mongoid 7.0 and lower is standard output. To change the log destination, create a new logger instance as follows:
To change the Ruby driver log level or destination:
To set the driver logger to be the same as the Mongoid logger:
Note
Mongoid does not alter the driver’s logger when running in standalone mode.
Usage with Forking Servers¶
When using Mongoid with a forking web server such as Puma, Unicorn or Passenger, it is recommended to not perform any operations on Mongoid models in the parent process prior to the fork.
When a process forks, Ruby threads are not transferred to the child processes
and the Ruby driver Client objects lose their background monitoring. The
application will typically seem to work just fine until the deployment
state changes (for example due to network errors, a maintenance event) at
which point the application is likely to start getting NoServerAvailable
exception when performing MongoDB operations.
If the parent process needs to perform operations on the MongoDB database, reset all clients in the workers after they forked. How to do so depends on the web server being used.
If the parent process does not need to perform operations on the MongoDB database after child processes are forked, close the clients in the parent prior to forking children. If the parent process performs operations on a Mongo client and does not close it, the parent process will continue consuming a connection slot in the cluster and will continue monitoring the cluster for as long as the parent remains alive.
Note
The close/reconnect pattern described here should be used with Ruby driver version 2.6.2 or higher. Previous driver versions did not recreate monitoring threads when reconnecting.
Use the on_worker_boot
hook to reconnect clients in the workers and
the before_fork
hook to close clients in the parent process
(`Puma documentation <<https://puma.io/puma/>`_):
Use the after_fork
hook to reconnect clients in the workers and
the before_fork
hook to close clients in the parent process
(Unicorn documentation):
Use the starting_worker_process
hook to reconnect clients in the workers
(Passenger documentation).
Passenger does not appear to have a hook that is invoked in the parent process
before the workers are forked.
Development Configuration¶
Driver’s default configuration is suitable for production deployment. In development, some settings can be adjusted to provide a better developer experience.
:server_selection_timeout
: set this to a low value (e.g.,1
)
if your MongoDB server is running locally and you start it manually. A low server selection timeout will cause the driver to fail quickly when there is no server running.
Sample recommended development configuration: