Docs Menu
Docs Home
/ / /
몽고이드
/

지속성 구성

이 페이지의 내용

  • 문서 저장
  • 지속성 컨텍스트 속성
  • 관습
  • 모델 수준 지속성 옵션
  • 런타임 지속성 옵션
  • 클라이언트 및 컬렉션 액세스

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_namecollection_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_clientMongoid.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(...)

돌아가기

맵/리듀스