지속성 구성
문서 저장
Mongoid는 기본적으로 클래스 이름의 복수형인 컬렉션에 문서를 저장합니다. 다음 Person
클래스의 경우 문서가 저장되는 컬렉션의 이름은 people
입니다.
class Person include Mongoid::Document end
모델 클래스 이름은 단어의 복수형으로 간주되므로 's'로 끝날 수 없습니다. 예를 예시 '상태'는 '상태'의 복수형으로 간주되므로 몇 가지 알려진 문제가 발생합니다.
이는 Mongoid가 파일 이름과 컬렉션 이름에서 클래스 이름으로 변환하는 데 사용하는 ActiveSupport::Inflector#classify
의 제한 사항입니다. 모델 클래스에 대한 사용자 지정 굴절 규칙을 지정하여 이 문제를 해결할 수 있습니다. 예를 들어, 다음 코드는 Status
이라는 모델을 처리합니다.
ActiveSupport::Inflector.inflections do |inflect| inflect.singular("status", "status") end
모델의 문서에 대한 컬렉션 을 다른 곳에 유지하려는 경우 클래스 수준에서 변경할 수 있습니다. 모델이 기본값에서 유지되는 데이터베이스 및 클라이언트 를 변경할 수도 있습니다.
class Person include Mongoid::Document store_in collection: "citizens", database: "other", client: "analytics" end
store_in
매크로는 lambdas도 사용할 수 있으며, 멀티 테넌트 애플리케이션이 일반적인 경우입니다.
class Band include Mongoid::Document store_in database: ->{ Thread.current[:database] } end
문서 가 데이터베이스 에 저장되면 Ruby 객체 는 BSON 으로 직렬화되며 다음과 같은 구조를 갖습니다.
{ "_id" : ObjectId("4d3ed089fb60ab534684b7e9"), "title" : "Sir", "name" : { "_id" : ObjectId("4d3ed089fb60ab534684b7ff"), "first_name" : "Durran" }, "addresses" : [ { "_id" : ObjectId("4d3ed089fb60ab534684b7e0"), "city" : "Berlin", "country" : "Deutschland" } ] }
지속성 컨텍스트 속성
Mongoid는 모델 클래스에 client_name
, database_name
및 collection_name
메서드를 제공하여 지속성에 사용되는 클라이언트, 데이터베이스 및 컬렉션 이름을 결정합니다.
Band.client_name # => :default Band.database_name # => "mongoid" Band.collection_name # => :bands
관습
문서를 기본값이 아닌 다른 소스에 보관하거나 기본값 과 다른 옵션을 사용하여 문서를 유지하려는 경우가 있을 수 있습니다. Mongoid는 이에 대한 런타임 지원 과 모델별 지원 을 제공합니다.
모델 수준 지속성 옵션
모델별로 사용자 지정 컬렉션 이름, 다른 데이터베이스 또는 다른 클라이언트 에 저장 하도록 지정할 수 있습니다. 다음 예시 에서는 기본값 으로 밴드 클래스를 " 음악 " 데이터베이스 의 " 아티스트 " 컬렉션 에 저장 하고 클라이언트 "분석"을 사용합니다.
client
옵션에 제공된 값은 mongoid.yml의 clients
아래에 구성되어야 합니다.
class Band include Mongoid::Document store_in collection: "artists", database: "music", client: "analytics" end
store_in
매크로가 제공되지 않았다면 Mongoid는 기본값 클라이언트 의 기본값 데이터베이스 에 있는 'Bands'라는 컬렉션 에 모델을 저장 합니다.
런타임 지속성 옵션
모델 클래스 또는 인스턴스 에서 with
메서드를 사용하여 작업 그룹 의 지속성에 사용되는 클라이언트, 데이터베이스 및 컬렉션 뿐만 아니라 모든 MongoDB 클라이언트 옵션을 변경할 수 있습니다.
Band.with(database: "music-non-stop") do |klass| klass.create(...) band = Band.first Band.create(...) end Band.with(collection: "artists") do |klass| klass.delete_all Band.delete_all end band.with(client: :tertiary) do |band_object| band_object.save! band.save! end
with
메서드는 임시 지속성 컨텍스트와 컨텍스트의 작업에 사용할 MongoDB 클라이언트 를 생성합니다. 차단 기간 동안 with
가 호출된 모델 클래스 또는 인스턴스 의 지속성 컨텍스트는 임시 지속성 컨텍스트로 변경됩니다. 편의상 with
가 호출된 모델 클래스 또는 인스턴스 는 차단 에 반환됩니다.
임시 지속성 컨텍스트는 쿼리와 쓰기 모두에 적용됩니다.
다양한 지속성 컨텍스트에서 지속성 작업을 수행할 때는 주의를 기울여야 합니다. 예를 예시 문서 가 임시 지속성 컨텍스트에 저장된 경우 기본값 지속성 컨텍스트에 문서가 존재하지 않아 후속 업데이트에 실패할 수 있습니다.
band = Band.new(name: "Scuba") band.with(collection: "artists") do |band_object| band_object.save! end # This will not save - updates the collection "bands" which does not have # the Scuba band band.update_attribute(likes: 1000) # This will update the document. band.with(collection: "artists") do |band_object| band_object.update_attribute(likes: 1000) end
Mongoid 6.0 부터 with
메서드는 항상 차단 과 함께 호출되어야 하며 임시 지속성 컨텍스트는 차단 기간 동안만 존재합니다. 이는 with
에 전달된 옵션을 사용하여 새 클라이언트 가 내부적으로 생성되기 때문입니다. 이 클라이언트 가 닫히고 관련 리소스가 해제되도록 하려면 이 클라이언트 를 사용할 수 있는 범위를 잘 정의해야 합니다.
전역 재정의
런타임에 모든 작업에 대한 지속성 컨텍스트를 전환하고 싶지만 코드 전체에서 사용하고 싶지 않은 경우, Mongoid는 클라이언트 및 데이터베이스 수준에서 전역적으로 이 작업을 수행할 수 있는 기능을 제공합니다. 이를 위한 메서드는 Mongoid.override_client
및 Mongoid.override_database
입니다. 이에 대한 유용한 사례는 서로 다른 국가 및 언어 설정에 대한 정보를 서로 다른 데이터베이스 또는 클라이언트에 저장하지만 각각의 스키마는 동일하게 유지되는 국제화된 애플리케이션입니다.
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
위의 예에서 모든 지속성 작업은 이 스레드의 나머지 모든 작업에 대해 대체 데이터베이스에 저장됩니다. 이것이 애프터 요청이 재정의를 다시 nil로 설정하는 이유이며, 로컬 매개 변수가 없는 후속 요청이 기본 옵션을 사용하도록 합니다.
지속성 컨텍스트는 읽기 및 쓰기 작업 모두에 적용됩니다. 예를 들어, 세컨더리 읽기는 다음과 같이 수행할 수 있습니다.
Band.with(read: {mode: :secondary}) do Band.count end
클라이언트 및 컬렉션 액세스
작업을 수행하기 위해 운전자 수준으로 드롭다운하려면 모델 또는 문서 인스턴스 에서 mongo 클라이언트 또는 컬렉션 을 가져올 수 있습니다.
Band.mongo_client band.mongo_client Band.collection band.collection
여기에서 클라이언트의 #with
을(를) 사용하여 동일한 런타임 지속성 옵션을 사용할 수도 있습니다.
client = Band.mongo_client.with(write: { w: 0 }, database: "musik") client[:artists].find(...)
#with
컬렉션을 사용하여 컬렉션 의 :read 또는 : 쓰기 (write) 옵션을 재정의할 수도 있습니다.
collection_w_0 = Band.collection.with(write: { w: 0 }) collection_w_0[:artists].find(...)