構成
項目一覧
Mongoid は、オプションとクライアントを指定する mongoid.yml
ファイルを介してカスタム構成されます。 最も単純な構成は次のとおりです。これは、Mongoid が "localhost:27017" の MongoDB サーバーとやり取りし、"mongoid" という名前のデータベースを使用するように構成します。
development: clients: default: database: mongoid hosts: - localhost:27017
構成ファイルの最上位キー(上記の例ではdevelopment
)は、アプリケーションが実行されている環境名development
、 test
、またはproduction
を示します。 上記の例では 3 つ目のレベルのキー default
は、 mongoクライアント名を参照します。 ほとんどのアプリケーションはdefault
という名前の単一のクライアントを使用します。
デフォルト構成の生成
Ruby on Rails を使用している場合は、次のコマンドを実行して Mongoid にデフォルトの構成ファイルを生成できます。
rails g mongoid:config
構成ファイルはconfig/mongoid.yml
に配置されます。 初期化子も作成され、 config/initializers/mongoid.rb
に配置されます。 すべての構成はconfig/mongoid.yml
で指定することを推奨しますが、必要に応じて、 mongoid.rb
初期化オプションを構成オプションの設定に使用することもできます。 ただし、 mongoid.yml
の設定は常に初期化設定の設定よりも優先されることに注意してください。
Ruby on Rails を使用していない場合は、上記の最小構成をコピーして、 config/mongoid.yml
として保存できます。
Mongoid 構成のロード
Ruby on Rails を使用している場合、アプリケーションの読み込み時に、 Rails.env
に保存されている現在の環境の Mongoid 構成が自動的に読み込まれます。
アプリケーションの ORM を Mongoid となるように構成するには、以下をapplication.rb
に追加します。
config.generators do |g| g.orm :mongoid end
Ruby on Rails を使用していない場合、Mongoid 構成は手動でロードする必要があります。 これは、次のように構成ファイル パスを引数としてMongoid.load!
メソッドで実行できます。
# Use automatically detected environment name Mongoid.load!("path/to/your/mongoid.yml") # Specify environment name manually Mongoid.load!("path/to/your/mongoid.yml", :production)
Mongoid が環境名を自動的に検出するよう求めている場合、次のソースを順番に調べます。
Rails
の最上位定数が定義されている場合、Rails.env
は 。Sinatra
の最上位定数が定義されている場合、Sinatra::Base.environment
は 。RACK_ENV
環境変数。MONGOID_ENV
環境変数。
構成ファイルを使用せずに、Ruby で Mongoid を直接構成することもできます。 この構成スタイルは、環境の概念をサポートしていません。どの構成が提供されているかは、現在の環境に適用されますが、複数のクライアントの定義はサポートされています。
Mongoid.configure do |config| config.clients.default = { hosts: ['localhost:27017'], database: 'my_db', } config.log_level = :warn end
注意
Mongoid は、そのコンポーネントが使用または参照される前に構成する必要があります。 コンポーネントが使用または参照されると、構成を変更しても、すでにインスタンス化されているコンポーネントには変更が適用されない可能性があります。
Mongoid 構成オプション
次の注釈付きの例mongoid.yml
は、Mongoid の構成方法を示しています。
Mongoid は、クライアント構成を Ruby ドライバーに委任します。 ドライバー オプションの詳細については、 のドライバーのドキュメントを参照してください。
development: # Configure available database clients. (required) clients: # Defines the default client. (required) default: # Mongoid can connect to a URI accepted by the driver: # uri: mongodb://user:password@mongodb.domain.com:27017/my_db_development # Otherwise define the parameters separately. # This defines the name of the default database that Mongoid can connect to. # (required). database: my_db_development # Provides the hosts the default client can connect to. Must be an array # of host:port pairs. (required) hosts: - localhost:27017 options: # Note that all options listed below are Ruby driver client options (the mongo gem). # Please refer to the driver documentation of the version of the mongo gem you are using # for the most up-to-date list of options. # 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. Valid options include: # :scram, :scram256, :mongodb_cr, :mongodb_x509, :gssapi, :aws, :plain. # MongoDB Server defaults to :scram, which will use "SCRAM-SHA-256" if available, # otherwise fallback to "SCRAM-SHA-1" (:scram256 will always use "SCRAM-SHA-256".) # This setting is handled by the MongoDB Ruby Driver. Please refer to: # https://mongodb.com/ja-jp/docs/ruby-driver/current/reference/authentication/ # auth_mech: :scram # The database or source to authenticate the user against. # (default: the database specified above or admin) # auth_source: admin # Force a the driver cluster to behave in a certain manner instead of auto- # discovering. Can be one of: :direct, :replica_set, :sharded. Set to :direct # when connecting to hidden members of a replica set. # connect: :direct # Changes 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: 5) # wait_queue_timeout: 5 # 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: name # Compressors to use for wire protocol compression. (default is to not use compression) # "zstd" requires zstd-ruby gem. "snappy" requires snappy gem. # Refer to: https://www.mongodb.com/ja-jp/docs/ruby-driver/current/reference/create-client/#compression # compressors: ["zstd", "snappy", "zlib"] # 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 to do peer certification validation. (default: true) # ssl_verify: true # The file containing concatenated certificate authority certificates # used to validate certs passed from the other end of the connection. # ssl_ca_cert: /path/to/ca.cert # Whether to truncate long log lines. (default: true) # truncate_logs: true # Configure Mongoid-specific options. (optional) options: # Allow BSON::Decimal128 to be parsed and returned directly in # field values. When BSON 5 is present and the this option is set to false # (the default), BSON::Decimal128 values in the database will be returned # as BigDecimal. # # @note this option only has effect when BSON 5+ is present. Otherwise, # the setting is ignored. # allow_bson5_decimal128: false # Application name that is printed to the MongoDB logs upon establishing # a connection. 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: nil # When this flag is false, callbacks for embedded documents will not be # called. This is the default in 9.0. # # Setting this flag to true restores the pre-9.0 behavior, where callbacks # for embedded documents are called. This may lead to stack overflow errors # if there are more than cicrca 1000 embedded documents in the root # document's dependencies graph. # See https://jira.mongodb.org/browse/MONGOID-5658 for more details. # around_callbacks_for_embeds: false # Sets the async_query_executor for the application. By default the thread pool executor # is set to `:immediate`. Options are: # # - :immediate - Initializes a single +Concurrent::ImmediateExecutor+ # - :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+ # that uses the +async_query_concurrency+ for the +max_threads+ value. # 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. # belongs_to_required_by_default: true # Set the global discriminator key. # discriminator_key: "_type" # Raise an exception when a field is redefined. # duplicate_fields_exception: false # Defines how many asynchronous queries can be executed concurrently. # This option should be set only if `async_query_executor` is set # to `:global_thread_pool`. # global_executor_concurrency: nil # When this flag is true, any attempt to change the _id of a persisted # document will raise an exception (`Errors::ImmutableAttribute`). # This is the default in 9.0. Setting this flag to false restores the # pre-9.0 behavior, where changing the _id of a persisted # document might be ignored, or it might work, depending on the situation. # immutable_ids: true # Include the root model name in json serialization. # include_root_in_json: false # # Include the _type field in serialization. # include_type_for_serialization: false # Whether to join nested persistence contexts for atomic operations # to parent contexts by default. # join_contexts: false # When this flag is false (the default as of Mongoid 9.0), a document that # is created or loaded will remember the storage options that were active # when it was loaded, and will use those same options by default when # saving or reloading itself. # # When this flag is true you'll get pre-9.0 behavior, where a document will # not remember the storage options from when it was loaded/created, and # subsequent updates will need to explicitly set up those options each time. # # For example: # # record = Model.with(collection: 'other_collection') { Model.first } # # This will try to load the first document from 'other_collection' and # instantiate it as a Model instance. Pre-9.0, the record object would # not remember that it came from 'other_collection', and attempts to # update it or reload it would fail unless you first remembered to # explicitly specify the collection every time. # # As of Mongoid 9.0, the record will remember that it came from # 'other_collection', and updates and reloads will automatically default # to that collection, for that record object. # legacy_persistence_context_behavior: false # 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 they 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. # legacy_readonly: false # The log level. # # It must be set prior to referencing clients or Mongo.logger, # changes to this option are not be propagated to any clients and # loggers that already exist. # # Additionally, only when the clients are configured via the # configuration file is the log level given by this option honored. # log_level: :info # Store BigDecimals as Decimal128s instead of strings in the db. # map_big_decimal_to_decimal128: true # Preload all models in development, needed when models use inheritance. # preload_models: false # When this flag is true, callbacks for every embedded document will be # called only once, even if the embedded document is embedded in multiple # documents in the root document's dependencies graph. # This is the default in 9.0. Setting this flag to false restores the # pre-9.0 behavior, where callbacks are called for every occurrence of an # embedded document. The pre-9.0 behavior leads to a problem that for multi # level nested documents callbacks are called multiple times. # See https://jira.mongodb.org/browse/MONGOID-5542 # prevent_multiple_calls_of_embedded_callbacks: true # Raise an error when performing a #find and the document is not found. # raise_not_found_error: true # Raise an error when defining a scope with the same name as an # existing method. # scope_overwrite_exception: false # Return stored times as UTC. # use_utc: false # Configure Driver-specific options. (optional) driver_options: # When this flag is off, an aggregation done on a view will be executed over # the documents included in that view, instead of all documents in the # collection. When this flag is on, the view filter is ignored. # broken_view_aggregate: true # When this flag is set to false, the view options will be correctly # propagated to readable methods. # broken_view_options: true # When this flag is set to true, the update and replace methods will # validate the parameters and raise an error if they are invalid. # validate_update_replace: false
バージョンベースのデフォルト
Mongoid は、特定のバージョンのデフォルトへの構成オプションの設定をサポートしています。 これは、新しい Mongoid バージョンにアップグレードするのに役立ちます。 Mongoid のバージョンをアップグレードするときは、 Mongoid::Config
に以下を設定する必要があります。
Mongoid.configure do |config| config.load_defaults <OLD VERSION> end
そのため、Mongoid の新しいバージョンにアップグレードすると、コードは Mongoid の前のバージョンの構成オプションで実行されます。 次に、新しいバージョンの機能フラグを 1 つずつ変更し、コードが引き続き期待どおりに動作することをテストできます。 新しい機能フラグがすべて考慮されたら、 load_defaults
への呼び出しが新しいバージョンで取得されるように変更され、変更された機能フラグがすべて削除されます。
たとえば、 7.5から8.0にアップグレードする とします。 これらの 2 つのバージョンの間に、 legacy_attributes
とmap_big_decimal_to_decimal128
の 2 つの機能フラグが追加されました。 Mongoid 8にアップグレードする前に、以下をMongoid::Config
に追加してください。
Mongoid.configure do |config| config.load_defaults 7.5 end
Gemfile
で Mongoid 8.0にアップグレードした後も、すべての機能フラグは7.5に設定されたままになります デフォルトの動作: legacy_attributes: true,
map_big_decimal_to_decimal128: false
。 次に、これらの機能フラグを 1 つずつそれぞれの8.0に切り替えられます。 動作:
Mongoid.configure do |config| config.load_defaults 7.5 config.legacy_attributes = false # config.map_big_decimal_to_decimal128 = true end
これらは一度に 1 つずつ実行することをお勧めします。そのため、上記の例では 2 番目のフラグはコメント アウトしたままになります。 legacy_attributes
フラグをオフにしてコードが期待どおりに動作することを確認したら、 map_big_decimal_to_decimal128
設定のコメント解除が可能になります。 この機能も検証されたら、これらの行の両方を削除し、 load_defaults
は次のように置き換えられます。
Mongoid.configure do |config| config.load_defaults 8.0 end
ERb 前処理
構成ファイルをロードすると、Mongoid は YAML として解析する前に ERb で処理します。 これにより、環境変数に基づいて実行時に構成ファイルの内容を構築できます。
development: clients: default: uri: "<%= ENV['MONGODB_URI'] %>"
注意
ERb から値を出力するときは、値が有効な YAML であることを確認し、必要に応じてエスケープします。
注意
ERb レンダリングは YAML 解析より前に実行されるため、YAML コメントにあるものを含む、構成ファイル内のすべての ERb ディレクティブが評価されます。
ログ記録
ロギングを構成する際は、Mongoid が MongoDB Ruby ドライバー上にモデルレイヤーを提供し、ドライバーが CRUD 操作を MongoDB 配置にディスパッチすることに注意してください。 そのため、Mongoid を使用するアプリケーションのログ出力の一部は Mongoid 自体から取得され、一部はドライバーから取得されます。
mongoクライアントはRubyドライバー クライアント インスタンスであるため、 mongoクライアントのロガーは Mongoid ロガーではなくRubyドライバー ロガーです。 つまり、次のようになります。
# Ruby driver logger, not Mongoid logger Mongoid.client(:default).logger
Mongoid が Ruby on Rails アプリケーションで使用されているかどうか、および Mongoid ドライバーと Ruby ドライバーの両方がどのように構成されているかに応じて、同じロガー インスタンスまたは異なる インスタンスを使用する場合があり、構成が異なる場合があります。
Ruby on Rails アプリケーションでは
Ruby on Rails アプリケーションで使用する場合、Mongoid はデフォルトで Rails からロガーとログ レベルを継承し、ドライバーのロガーを同じロガー インスタンスに設定します。
Rails.logger === Mongoid.logger # => true Mongoid.logger === Mongo::Logger.logger # => true
ログレベルを変更するには、 標準の Rails 構成 を使用します 。環境構成ファイルの 1 つに以下を配置します( config/environments/production.rb
など)。
Rails.application.configure do config.log_level = :debug end
注意
Mongoid が Rails アプリケーションで動作する場合、 log_level
Mongoid 構成オプションは使用されません。この場合、Mongoid は Rails のログレベルを継承するためです。
Mongoid ロガーまたはドライバー ロガーのいずれかを Rails ロガーとは異なる方法で構成するには、次のように初期化子を使用します。
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
注意
Ruby 標準ライブラリLogger
には現在、ロガーが使用しているログデバイス( IO
オブジェクト)を返すためのプロビジョニングはありません。 たとえば、Mongoid や Ruby ドライバーのログを標準の Rails ログファイル(例: log/development.log
)ただし、標準の Rails ロガー( Rails.logger
)とは異なるレベルでは、ファイルを個別に開き、結果のIO
オブジェクトをLogger
コンストラクターに渡す必要があります。
注意
デフォルトでは、Mongoid は自分のロガーとドライバーのロガーを Rails ロガーと同じインスタンスに設定するため、 インスタンスのいずれかを変更すると、それらすべてに影響します。 たとえば、次の変更では、上記の説明のように、アプリケーションがMongo::Logger.logger
に個別のLogger
インスタンスを割り当てていない限り、3 つのロガーすべてのログ レベルが変更されます。
Mongoid::Logger.logger.level = Logger::DEBUG
スタンドアロン
Ruby on Rails アプリケーションにロードされていない場合、Mongoid はlog_level
最上位構成オプションを尊重します。 これは、次のように構成ファイルで指定できます。
development: clients: default: # ... options: log_level: :debug
... または Mongoid インラインで構成する場合は、次のようにします。
Mongoid.configure do |config| config.log_level = :debug end
Mongoid 7.1 以降のデフォルトのログ先は標準エラーです。 Mongoid 7.0 以前のデフォルトのログ先は標準出力です。 ログの保存先を変更するには、次のように新しいロガー インスタンスを作成します。
Mongoid.logger = Logger.new(STDERR).tap do |logger| logger.level = Logger::DEBUG end
Ruby ドライバーのログ レベルまたは宛先変更先を変更するには:
Mongo::Logger.logger = Logger.new(STDERR).tap do |logger| logger.level = Logger::DEBUG end
ドライバー ロガーを Mongoid ロガーと同じものに設定するには、次の手順に従います。
Mongo::Logger.logger = Mongoid.logger
注意
Mongoid は、スタンドアロン モードで実行中にドライバーのロガーを変更しません。
タイムゾーン
Mongoid は、Ruby の標準ライブラリよりもはるかに堅牢な ActiveSupport のタイム ゾーン機能を使用します。 重要な点として、ActiveSupport では、日付と時刻の値を操作するためのコンテキストを提供するスレッドグローバル変数であるTime.zone
の構成が許可されます。
Ruby のタイム ゾーンの完全な処理は、このチュートリアルの範囲外ですが、正しいタイム ゾーンの処理を実現する最も簡単で確実な方法は次のとおりです。
オペレーティング システムのタイム ゾーンを UTC に設定します。 たとえば、Linux の場合は次のようになります。
cp /usr/share/zoneinfo/UTC /etc/localtime
アプリケーションのデフォルトのタイムゾーンを UTC に設定します。
# If using Rails, in application.rb: class Application < Rails::Application config.time_zone = 'UTC' end # If not using Rails: Time.zone = 'UTC'
各 コントローラーとジョブ クラスで、可能な場合は のステージで適切なタイムゾーンを
before_filter
に設定します。 たとえば、アプリケーションの各ユーザーが自分のタイムゾーンを設定できる場合は、次のようにします。
class ApplicationController < ActionController::Base before_filter :fetch_user, :set_time_zone def set_time_zone Time.zone = @user.time_zone end end
ここからは、ローカル タイム ゾーンで時間は自然に動作します。 たとえば、 ビューでは次のようになります。
Turned into a pumpkin after <%= cinderella.updated_at.seconds_after_midnight %> seconds!
Ruby 標準ライブラリではなく、ActiveSupport メソッドを使用します。
Time.zone.now
orTime.current` instead of ``Time.now
Date.current
の代わりにDate.today
重要な注意点として、後続の Ruby 標準ライブラリ メソッドがシステム タイムゾーン(例: UTC )、および
Time.zone
の値ではありません。 これらの名前の似たメソッドを混同するのが非常に簡単なため、 Ruboped の Rails/TimeZone op を使用することをお勧めします。 CI 内の 。
MongoDB から読み込まれたデータのタイムゾーンの設定
MongoDB は、タイムゾーン情報なしですべての時間を UTC で保存します。 Mongoid モデルは時間値をActiveSupport::TimeWithZone
のインスタンスとして読み込み、返します。 データベースからの読み込み時に Mongoid がタイムゾーンを設定する方法を制御するには、 use_utc
オプションを設定します。
false(デフォルト)の場合、Mongoid は
Time.zone
を使用して、値がデータベースから読み込まれる時間のタイムゾーンを設定します。true の場合、Mongoid は読み込まれた時間値のタイム ゾーンを常に UTC として設定します。
use_utc
はデータのロード方法のみに影響し、データの保持方法には影響しません。 たとえば、 Time
またはActiveSupport::TimeWithZone
インスタンスを時間フィールドに割り当てると、 use_utc
の設定に関係なく、割り当てられたインスタンスのタイムゾーン情報が常に使用されます。 あるいは、時間フィールドに string の値を割り当てると、string 内のすべてのタイムゾーン情報が存在する場合は、使用されます。 string にタイムゾーン情報が含まれていない場合は、 Time.zone
に従って解析されます。 説明するには次のようにします。
Time.use_zone("Asia/Kolkata") do # String does not include time zone, so "Asia/Kolkata" will be used ghandi.born_at = "1869-10-02 7:10 PM" # Time zone in string (-0600) will be used amelia.born_at = "1897-07-24 11:30 -0600" end
の構成 SSLContext
特定の暗号を有効または無効にするなど、アプリケーションで TLS オプションをさらに構成することが必要な場合があります。
これは、Ruby ドライバーに TLS コンテキスト フックを設定することで実行できます。TLS コンテキスト フックは、ドライバー内の TLS ソケット接続の前に呼び出されるユーザー提供のProc
(s)であり、基礎となるOpenSSL::SSL::SSLContext
の変更に使用できます。ソケットで使用されるオブジェクト。
TLS コンテキスト フックを設定するには、 Mongo.tls_context_hooks
配列にProc
(s)を追加します。 これは初期化で実行できます。 以下の例では、「AES 256 -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
Proc
内のすべてのMongo.tls_context_hooks
OpenSSL::SSL::SSLContext
には、単一の引数として オブジェクトが渡されます。これらのプロシージャは、ソケットの作成中に順番に実行されます。
警告
TLS コンテキスト フックはグローバルであり、アプリケーション内のすべてのMongo::Client
インスタンスに影響します。
TLS コンテキスト フック(割り当てと削除のベストプラクティスを含む)の詳細については、 Ruby ドライバーのドキュメントを参照してください。
ネットワーク圧縮
Mongoid は、MongoDB サーバーとの間のメッセージの圧縮をサポートしています。 この機能は、MongoDB サーバーでサポートされている 3 つのアルゴリズムを実装する Ruby ドライバーによって提供されます。
Snappy :
snappy
圧縮は、 以降の MongoDB サーバーに接続するときに使用できます。34リリースには snappy が必要です インストールするライブラリ。zlib:
zlib
圧縮は、MongoDB 以降の3 サーバーに接続するときに使用できます。6リリース。Zstandard :
zstd
圧縮は、 以降の MongoDB サーバーに接続するときに使用できます。42リリース日には zstd- Ruby が必要です インストールするライブラリ。
ワイヤプロトコル圧縮を使用するには、 mongoid.yml
内で Ruby ドライバー オプションを構成します。
development: # Configure available database clients. (required) clients: # Define the default client. (required) default: # ... options: # These options are Ruby driver options, documented in # https://mongodb.com/ja-jp/docs/ruby-driver/current/reference/create-client/ # ... # Compressors to use. (default is to not use compression) # Valid values are zstd, zlib or snappy - or any combination of the three compressors: ["zstd", "snappy"]
コンプレッサーが明示的に要求されていない場合、1 つ以上のコンプレッサーに必要な依存関係がシステム上に存在しても、ドライバーは圧縮を使用しません。
ドライバーは、サーバーによってサポートされているコンプレッサーのうち、最初のコンプレッサーを選択します。 zstd
コンプレッサーは、他のコンプレッサーと比較して同じ CPU 消費で最も高い圧縮を生成するため推奨されます。
最大のサーバー互換性のために、3 つのコンプレッサーすべてを指定できます(例: compressors: ["zstd", "snappy", "zlib"]
。
クライアント側の暗号化
構成ファイルをロードする際、Mongoid は次の例に示すように、クライアント側の暗号化のスキーマ マップでkeyId
を指定するために使用されるBSON::Binary
インスタンスをファイルに含めることを許可します。
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"
フォーク サーバーでの使用
Pume などのフォーク Web サーバー、または子プロセスを生成するためにフォークするアプリケーションで Mongoid を使用する場合、特別な考慮事項が適用されます。
可能であれば、フォークの前に親プロセスで MongoDB 操作を実行しないことをお勧めします。これにより、フォークに関連するドロップダウンを回避できるようになります。
mongo Rubyドライバーがフォークを処理する方法の詳細な技術説明は、driver's "Usage with Forking Servers" documentation
<https://www.mongodb.com/ja-jp/docs/ruby-driver/current/reference/create-client/#usage-with-forking-servers>
に記載されています。 null では、 Mongo::Error::SocketError
やMongo::Error::NoServerAvailable
などのさまざまな接続エラーを回避するために、次の操作を行う必要があります。
Mongoid.disconnect_clients
を使用してフォークする前に、親 Ruby プロセス内の MongoDB クライアントを切断します。 これにより、親プロセスと子プロセスが誤って同じソケットを再利用したり、I/O 競合が発生したりすることがなくなります。Mongoid.disconnect_clients
は実行中の MongoDB 操作を中断することがなく、新しい操作を実行すると自動的に再接続されることに注意してください。Mongoid.reconnect_clients
を使用してフォークした後、子 Ruby プロセスで MongoDB クライアントを再接続します。 これは、子プロセスでドライバーの監視スレッドを再生成するために必要です。
ほとんどのウェブ サーバーは、ワーカー プロセスがフォークされたときにアプリケーションがアクションを実行するために使用できるフックを提供しています。 以下は、いくつかの一般的な Ruby ウェブ サーバーの構成例です。
Puma
on_worker_boot
フックを使用してワーカー内のクライアントを再接続し、before_fork
とon_refork
フックを使用して親プロセス内のクライアントを閉じます( Pume ドキュメント )。
# config/puma.rb # Runs in the Puma master process before it forks a child worker. before_fork do Mongoid.disconnect_clients end # Required when using Puma's fork_worker option. Runs in the # child worker 0 process before it forks grandchild workers. on_refork do Mongoid.disconnect_clients end # Runs in each Puma child process after it forks from its parent. on_worker_boot do Mongoid.reconnect_clients end
Unicode
after_fork
フックを使用してワーカー内のクライアントを再接続し、before_fork
フックを使用して親プロセス内のクライアントを閉じます( Unicode ドキュメント ):
# config/unicorn.rb before_fork do |_server, _worker| Mongoid.disconnect_clients end after_fork do |_server, _worker| Mongoid.reconnect_clients end
乗用者
starting_worker_process
フックを使用してワーカー内のクライアントを再接続します( 乗用ドキュメント )。ペインには、ワーカーがフォークされる前に親プロセスで呼び出されるフックが存在するようには表示されません。
if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| Mongoid.reconnect_clients if forked end end
クエリキャッシュミドルウェア
Rack Web リクエストでのクエリキャッシュの有効化
MongoDB Ruby ドライバーは、各ウェブ リクエストの実行中にクエリ キャッシュを有効にする Rack ミドルウェアを提供します。 以下は、Ruby on Rails アプリケーションでクエリ キャッシュ ミドルウェアを有効にする方法の例です。
# config/application.rb # Add Mongo::QueryCache::Middleware at the bottom of the middleware stack # or before other middleware that queries MongoDB. config.middleware.use Mongo::QueryCache::Middleware
Rails on Rack ガイド を参照してください Rails アプリケーションで Rack ミドルウェアを使用する方法の詳細については、 を参照してください。
ActiveJob でのクエリ キャッシュの有効化
MongoDB Ruby ドライバーは、ActiveJob のクエリ キャッシュ ミドルウェアも提供します。 初期化設定のすべてのジョブに対してこれを有効にすることができます。
# config/initializers/active_job.rb # Enable Mongo driver query cache for ActiveJob ActiveSupport.on_load(:active_job) do include Mongo::QueryCache::Middleware::ActiveJob end
または、特定のジョブ クラスの場合は、次のようになります。
class MyJob < ActiveJob::Base include Mongo::QueryCache::Middleware::ActiveJob end
開発構成
ドライバーのデフォルト構成は本番環境の配置に適しています。 開発では、開発者エクスペリエンスを向上させるために一部の設定を調整することができます。
:server_selection_timeout
: MongoDB サーバーがローカルで実行され、手動で起動する場合は、これを低い値(例:1
)に設定します。 サーバー選択タイムアウトが短いと、サーバーが実行されていない場合にドライバーがすぐに失敗します。
推奨される開発構成の例は以下のとおりです。
development: clients: default: database: mongoid hosts: - localhost:27017 options: server_selection_timeout: 1