다음 버전의 새로운 기능에 대해 알아보세요:
릴리스 목록 및 자세한 출시하다 노트를 보려면 Github 의 Mongoid 릴리스 를 참조하세요.
9.0.11의 새로운 기능
9.0.11 출시하다 다음과 같은 새로운 기능이 포함되어 있습니다.
allow_reparenting_via_nested_attributes 구성
Mongoid v9.0.11 에는 Mongoid::Config.allow_reparenting_via_nested_attributes 구성 옵션이 도입되었습니다. 이 옵션은 중첩된 속성을 통해 종속 has_many 레코드의 부모를 다시 지정할 수 있는지 여부를 제어합니다.
이 옵션의 기본값은 true이며, 레거시 동작을 유지합니다. 중첩된 속성을 통한 부모 재지정을 방지하려면 이 옵션을 false로 설정하다 .
Mongoid::Config.allow_reparenting_via_nested_attributes = false
Mongoid v9.1에서는 이 옵션의 기본값 false입니다. 이 옵션은 Mongoid v10에서 제거될 예정입니다.
변경되지 않은 하위 트리에 대한 자동 저장 동작
Mongoid v9.0.11 에는 Mongoid.autosave_saves_unchanged_documents 구성 옵션이 도입되었습니다. 이 옵션은 하위 트리의 문서 에 autosave: true가 있는 경우 Mongoid가 연결 하위 트리의 모든 문서를 자동으로 저장할지 여부를 제어합니다.
이전 Mongoid 버전에서는 autosave: true 와의 연결로 인해 Mongoid가 모든 하위 문서에서 #save 를 호출하고 해당 문서의 변경 여부에 관계없이 모든 해당 after_save 후크를 재귀적으로 호출했습니다.
이 옵션의 기본값은 true이며, 레거시 동작을 유지합니다. 변경된 문서가 포함된 하위 트리만 자동으로 저장하려면 이 옵션을 false로 설정하다 .
Mongoid.autosave_saves_unchanged_documents = false
Mongoid v9.1에서는 이 옵션의 기본값 false입니다. 이 옵션은 Mongoid v10에서 제거될 예정입니다.
Ruby 4.0지원
Mongoid v9.0.11 는 Ruby 4.0에 대한 공식 지원 추가합니다.
9.0.7의 새로운 기능
경고
호환성이 손상되는 변경
9.0.7 출시하다 호환성이 손상되는 변경이 포함되어 있습니다.
9.0.7 출시하다 다음과 같은 변경 사항이 포함됩니다.
이전 Mongoid 버전에서는 자식이 변경되지 않은 경우 부모 상태 에 의존하는 자식 콜백이 더 이상 호출되지 않는 버그가 수정되었습니다. 수정 사항으로 인해 성능이 저하되었으므로 이 패치 버전은 이전 기능을 복원합니다. 이제 하위 콜백은 하위 자체가 변경된 경우에만 호출됩니다. 이렇게 하면 수정되지 않은 하위 항목에서 호출되는 콜백에 의존하는 앱에 호환성이 손상되는 변경이 도입됩니다( 예시: 하위 콜백 상태 변경한 상위 항목에 의존하는 경우).
다음 코드 샘플 상위 변경 사항에 대한 응답으로 하위 콜백을 호출하는 방법을 보여줍니다.
class Parent include Mongoid::Document has_many :children after_save { children.each(&:parent_changed_callback) } end class Child include Mongoid::Document belongs_to :parent def parent_changed_callback # ... end end
9.0의 새로운 기능
9.0 출시하다 에는 다음과 같은 새로운 기능, 개선 사항 및 수정 사항이 포함되어 있습니다.
Railsmdb
Mongoid v9.0의 출시하다 와 함께, Rails 애플리케이션을 생성, 업데이트, 관리 및 유지 관리하기 위한 명령줄 유틸리티인 railsmdb가 정식 출시되었습니다.
railsmdb 을(를) 사용하면 Ruby on Rails 개발자에게 이미 친숙한 공통 생성기를 통해 명령줄 에서 MongoDB 로 더 쉽게 작업할 수 있습니다.
예를 예시 railsmdb 를 사용하여 새 Mongoid 모델에 대한 스텁을 생성할 수 있습니다.
bin/railsmdb generate model person
이렇게 하면 app/models/person.rb 에 새 모델이 생성됩니다.
class Person include Mongoid::Document include Mongoid::Timestamp end
모델의 필드를 지정할 수 있습니다.
bin/railsmdb generate model person name:string birth:date
class Person include Mongoid::Document include Mongoid::Timestamp field :name, type: String field :birth, type: Date end
--parent 옵션을 전달하여 생성기에 새 모델을 다른 모델의 하위 클래스로 만들도록 지시할 수 있습니다.
bin/railsmdb generate model student --parent=person
class Student < Person include Mongoid::Timestamp end
모델 이름에서 유추할 수 있는 것과 다른 컬렉션 에 모델을 저장 해야 하는 경우 --collection를 지정할 수 있습니다.
bin/railsmdb generate model course --collection=classes
class Course include Mongoid::Document include Mongoid::Timestamp store_in collection: 'classes' end
자세한 내용은 Github 의 mongoid-railsmdb 리포지토리 참조하세요.
Ruby 2.6 및 JRuby 9.3에 대한 지원 중단
Mongoid v9.0 Ruby 2.7 이상 또는 JRuby 9.4이 필요합니다. 이전 Ruby 및 JRuby 버전은 지원되지 않습니다.
Rails 5에 대한 지원 중단
Mongoid v9.0 Rails 6.0 이상이 필요합니다. 이전 Rails 버전은 지원되지 않습니다.
사용되지 않는 클래스 제거 Mongoid::Errors::InvalidStorageParent
더 이상 사용되지 않는 클래스 Mongoid::Errors::InvalidStorageParent 이(가) 제거되었습니다.
around_* 내장된 문서에 대한 콜백은 무시됩니다.
Mongoid v8.x 이전 버전에서는 사용자가 내장된 문서에 대해 around_* 콜백을 정의할 수 있습니다. v9.0부터 이러한 콜백은 무시되며 실행되지 않습니다. 이러한 콜백이 정의되어 있으면 콘솔에 경고가 출력됩니다.
이전 동작을 복원 하려면 애플리케이션 에서 Mongoid.around_embedded_document_callbacks 을 true 로 설정하다 수 있습니다.
참고
내장된 문서에 around_* 콜백을 활성화하는 것은 문서 에 내장된 문서가 많은 경우 SystemStackError 예외가 발생할 수 있으므로 권장하지 않습니다. 자세한 내용은 MONGOID- 를5658 참조하세요.
for_js 메서드는 더 이상 사용되지 않습니다.
for_js 메서드는 더 이상 사용되지 않으며 Mongoid v10.0에서 제거될 예정입니다.
더 이상 사용되지 않는 옵션 제거
단절적 변경: Mongoid v 에서 다음 구성 옵션이 제거되었습니다.9.0 앱 에서 이에 대한 참조를 모두 제거했는지 확인하세요. 업그레이드하기 전에 config.load_defaults 8.1 를 사용하고 있었다면 동작이 변경되지 않습니다. 각 옵션의 의미는 이전 출시하다 노트를 참조하세요.
:use_activesupport_time_zone:broken_aggregables:broken_alias_handling:broken_and:broken_scoping:broken_updates:compare_time_by_ms:legacy_attributes:legacy_pluck_distinct:legacy_triple_equals:object_id_as_json_oid:overwrite_chained_operators
또한 config.load_defaults 버전 v7.5 및 이전 버전에 대한 지원 중단되었습니다(최소 버전 v8.0을 사용해야 함).
더 이상 사용되지 않는 기능 제거
단절적 변경: 이제 사용 중단된 다음 기능이 제거되었습니다.
Mongoid::QueryCache모듈이 제거되었습니다. 1-for-1 의 모든 사용법을Mongo::QueryCache(으)로 바꾸세요.Mongoid::QueryCache#clear_cache메서드는Mongo::QueryCache#clear로 대체되어야 합니다. 다른 모든 메서드와 하위 모듈은 이름이 동일합니다.Object#blank_criteria?메서드가 제거되었습니다(이전에는 더 이상 사용되지 않음).Document#as_json :compact옵션이 제거됩니다. 대신 반환된Hash객체 에서`#compact를 호출하세요.더 이상 사용되지 않는 클래스
Mongoid::Errors::InvalidStorageParent이(가) 제거되었습니다.
스레드 로컬 변수 가져오기 및 설정
버전 9.0.3에 추가 되었습니다.
Mongoid::Threaded.get 및 Mongoid::Threaded를 사용할 수 있습니다. 설정하다 메서드를 사용하여 스레드 로컬 변수를 쿼리 하고 수정합니다. 이러한 메서드를 사용해야 하는 경우를 학습 콜백 가이드 의스레드-로컬 변수 섹션을 참조하세요.
인덱스 검증 구성
버전 9.0.7에 추가 되었습니다.
Mongoid.allow_duplicate_index_declarations 구성 옵션을 사용하여 서버 에 인덱스 확인을 보낼 수 있습니다. 중복 인덱스 선언되면 서버 오류가 발생합니다. 자세히 학습하려면 애플리케이션 구성 가이드의 구성 옵션 섹션을 참조하세요.
touch 메서드에서 변경된 상태 지우기
Mongoid v8.x 이전 버전에서는 touch 메서드가 모델을 변경된 상태 로 유지합니다.
# v8.x behaviour band = Band.create! band.touch band.changed? # => true band.changes # => {"updated_at"=>[2023-01-30 13:12:57.477191135 UTC, 2023-01-30 13:13:11.482975646 UTC]}
v9.0부터 Mongoid는 이제 touch 메서드 사용 후 변경된 상태 올바르게 지웁니다.
# v9.0 behavior band = Band.create! band.touch band.changed? # => false band.changes # => {}
Rails 콘솔용 샌드박스 모드
Mongoid는 이제 Rails 콘솔 샌드박스 모드 지원합니다. Rails 콘솔이 --sandbox 플래그로 시작된 경우 Mongoid는 콘솔을 열기 전에 :default 클라이언트 에서 트랜잭션 시작합니다. 이 트랜잭션 커밋되지 않습니다. 따라서 :default 클라이언트 사용하여 콘솔에서 실행된 모든 명령은 데이터베이스 에 유지되지 않습니다.
참고
default 이외의 다른 클라이언트를 사용하여 샌드박스 모드에서 명령을 실행하는 경우 이러한 변경 사항은 평소대로 유지됩니다.
새로운 트랜잭션 API
Mongoid 9.0 은 Active Record에서 영감을 받은 새로운 트랜잭션 API 도입합니다.
Band.transaction do Band.create(title: 'Led Zeppelin') end band = Band.create(title: 'Deep Purple') band.transaction do band.active = false band.save! end
자세한 학습 은 트랜잭션 및 세션 가이드 참조하세요.
내장된 문서는 항상 상위 지속성 컨텍스트를 사용합니다.
Mongoid v8.x 이전 버전에서는 사용자가 내장된 문서 에 대한 지속성 컨텍스트를 지정할 수 있습니다(store_in 매크로 사용). Mongoid v9.0 에서 내장된 문서의 경우 이러한 설정이 무시됩니다. 이제 내장된 문서 항상 상위 문서의 지속성 컨텍스트를 사용합니다.
쿼리에 원시 값 전달 지원
이제 쿼리를 수행할 때 Mongoid::RawValue 래퍼 클래스를 사용하여 Mongoid의 유형 강제 변환 로직을 건너뛸 수 있습니다. 이는 데이터베이스 의 레거시 데이터가 필드 정의와 다른 유형일 때 유용할 수 있습니다.
class Person include Mongoid::Document field :age, type: Integer end # Query for the string "42", not the integer 42 Person.where(age: Mongoid::RawValue("42"))
쿼리 프로젝션에서 생략된 필드에 액세스할 때 AttributeNotLoaded 오류 발생
인스턴스가 로드될 때 only 또는 without 쿼리 프로젝션 메서드로 제외된 모델 인스턴스의 필드에 액세스하려고 하면 Mongoid에서 Mongoid::Errors::AttributeNotLoaded 오류를 발생시킵니다.
Band.only(:name).first.label #=> raises Mongoid::Errors::AttributeNotLoaded Band.without(:label).first.label = 'Sub Pop Records' #=> raises Mongoid::Errors::AttributeNotLoaded
이전 Mongoid 버전에서는 동일한 조건에서 ActiveModel::MissingAttributeError 가 발생했습니다. 이 클래스의 Mongoid 관련 사용법이 있는지 코드를 확인하고 Mongoid::Errors::AttributeNotLoaded 로 변경하세요. 또한 AttributeNotLoaded 는 Mongoid::Errors::MongoidError 에서 상속하지만 ActiveModel::MissingAttributeError 는 상속하지 않습니다.
구성된 표준 시간대를 사용하여 쿼리에서 Date 를 Time 로 타입캐스트
날짜 값을 사용하여 시간 필드를 쿼리할 때 Mongoid는 이제 Time.zone 을(를) 올바르게 고려하여 유형 변환을 수행합니다.
class Magazine include Mongoid::Document field :published_at, type: Time end Time.zone = 'Asia/Tokyo' Magazine.gte(published_at: Date.parse('2022-09-26')) #=> will return all results on or after Sept 26th, 2022 # at 0:00 in Asia/Tokyo time zone.
이전 Mongoid 버전에서는 위의 코드가 Time.zone (현재 제거된 :use_activesupport_time_zone 설정과 관계없이)을 무시하고 항상 시스템 시간대 구역 사용하여 유형 변환을 수행했습니다.
이전 Mongoid 버전에서는 지속성 작업 중에 Date 을 Time 로 타입캐스팅하는 것이 이미 구역 올바르게 사용하고 있었습니다.
touch 내장된 문서의 메서드가 touch: false 옵션을 올바르게 처리합니다.
embedded_in 관계에 touch: false 옵션이 설정하다 경우, 포함된 하위 문서 에서 touch 메서드를 호출해도 상위 문서 에서 touch 이(가) 호출되지 않습니다.
class Address include Mongoid::Document include Mongoid::Timestamps embedded_in :mall, touch: false end class Mall include Mongoid::Document include Mongoid::Timestamps embeds_many :addresses end mall = Mall.create! address = mall.addresses.create! address.touch #=> updates address.updated_at but not mall.updated_at
또한 touch 메서드는 여러 수준의 중첩된 내장된 문서를 사용하는 경우에도 상위 문서 당 하나의 지속성 작업을 수행하도록 최적화되었습니다.
embedded_in 연관 관계 기본값 touch: true
관계에 touch: false 을 명시적으로 설정하다 하지 않는 한 포함된 하위 문서를 업데이트하면 이제 자동으로 상위 문서를 터치합니다.
class Address include Mongoid::Document include Mongoid::Timestamps embedded_in :mall, touch: false end
다른 모든 연결의 경우 기본값 은 touch: false 로 유지됩니다.
upsert에서 :replace 옵션의 기본값 반전
Mongoid v8.1 upsert 메서드에 :replace 옵션을 추가했습니다. 이 옵션은 기존 문서 업데이트하거나 교체할지 여부를 지정하는 데 사용되었습니다.
Mongoid v9.0 이 플래그의 기본값 true 에서 false로 전환합니다. 즉, 기본값 으로 Mongoid v9.0 기존 문서 업데이트하고 대체하지 않습니다.
_id 필드의 불변성 적용
Mongoid v9.0 이전, _id 필드 변경하는 것은 문서 최상위 문서인지 내장된 문서인지, 그리고 업데이트 수행된 방식에 따라 일관되지 않게 동작합니다. v9.0에서, _id 필드 변경하면 문서 이전에 유지된 경우 문서 를 저장할 때 예외가 발생합니다.
Mongoid 9.0 은 또한 새로운 기능 플래그 immutable_ids 를 도입하며, 기본값은 true 입니다.
Mongoid::Config.immutable_ids = true
false로 설정하다 하면 일관되지 않은 이전 동작이 복원됩니다.
인덱스 옵션에서 필드 별칭 지원
index 매크로의 옵션에서 별칭이 지정된 필드 이름을 사용할 수 있는 지원이 추가되었습니다: partial_filter_expression, weights, wildcard_projection.
class Person include Mongoid::Document field :a, as: :age index({ age: 1 }, { partial_filter_expression: { age: { '$gte' => 20 } }) end
참고
partial_filter_expression 와 같은 인덱스 옵션에서 필드 이름 별칭 확장 은 MongoDB 서버 6.0 의 동작에 따라 수행됩니다. 향후 서버 버전에서는 이러한 옵션을 해석하는 방식이 변경될 수 있으며, Mongoid의 기능은 이러한 변경 사항을 지원 하지 않을 수 있습니다.
BSON 5 및 BSON::Decimal128 필드
BSON 4 이전 버전이 있는 경우 BSON::Decimal128 로 선언된 모든 필드 BSON::Decimal128 값을 반환합니다. 그러나 BSON 5 이 있는 경우 BSON::Decimal128 로 선언된 모든 필드 기본값 으로 BigDecimal 값을 반환합니다.
class Model include Mongoid::Document field :decimal_field, type: BSON::Decimal128 end # under BSON <= 4 Model.first.decimal_field.class #=> BSON::Decimal128 # under BSON >= 5 Model.first.decimal_field.class #=> BigDecimal
BSON 5과 함께 리터럴 BSON::Decimal128 값이 필요한 경우, Mongoid가 리터럴 BSON::Decimal128 필드를 허용하도록 지시할 수 있습니다:
Model.first.decimal_field.class #=> BigDecimal Mongoid.allow_bson5_decimal128 = true Model.first.decimal_field.class #=> BSON::Decimal128
참고
allow_bson5_decimal128 옵션은 BSON 5 이상에서만 효과가 있습니다. BSON 4 및 이전 버전에서는 설정을 완전히 무시합니다.
MongoDB Atlas 의 검색 인덱스 관리
이제 Mongoid는 MongoDB Atlas 에 연결되어 검색 인덱스 생성 및 제거를 지원합니다. Mongoid::SearchIndexable API 통해 프로그래밍 방식으로 이 작업을 수행할 수 있습니다.
class SearchablePerson include Mongoid::Document search_index { ... } # define the search index here end # create the declared search indexes; this returns immediately, but the # search indexes may take several minutes before they are available. SearchablePerson.create_search_indexes # query the available search indexes SearchablePerson.search_indexes.each do |index| # ... end # remove all search indexes from the model's collection SearchablePerson.remove_search_indexes
MongoDB Atlas 에 연결되어 있지 않으면 검색 인덱스 정의가 무시됩니다. 검색 인덱스를 생성, 열거 또는 제거 하려고 하면 오류가 발생합니다.
편의를 위해 레이크 작업도 사용할 수 있습니다.
# create search indexes for all models; waits for indexes to be created # and shows progress on the terminal. $ rake mongoid:db:create_search_indexes # as above, but returns immediately and lets the indexes be created in the # background $ rake WAIT_FOR_SEARCH_INDEXES=0 mongoid:db:create_search_indexes # removes search indexes from all models $ rake mongoid:db:remove_search_indexes
제거 Time.configured
Time.configured 구성된 시간대를 래핑하는 time 객체 또는 표준 Ruby Time 클래스를 반환합니다. 이를 통해 시간대가 구성되지 않은 경우에도 시간 값을 쿼리할 수 있습니다.
이제 Mongoid에서 시간 값으로 무엇이든 수행하려는 경우(문서에 타임스탬프 사용 포함) 시간대를 설정해야 합니다. Time.configured 을(를) 사용하려면 Time.zone 로 바꿔야 합니다.
# before: puts Time.configured.now # after: puts Time.zone.now # or, better for finding the current Time specifically: puts Time.current
표준 구역 를 설정하다 하지 않으면 nil 값과 관련된 코드에 오류가 표시됩니다. Rails를 사용하는 경우 기본값 구역 가 이미 UTC로 설정하다 되어 있습니다. Rails를 사용하지 않는 경우 다음과 같이 프로그램 시작 시 구역 를 설정하다 수 있습니다.
Time.zone = 'UTC'
이렇게 하면 구역 가 UTC로 설정하다 됩니다. 다음 명령을 실행 하여 사용 가능한 모든 구역 이름을 확인할 수 있습니다.
$ ruby -ractive_support/values/time_zone \ -e 'puts ActiveSupport::TimeZone::MAPPING.keys'
기록은 생성의 지속성 컨텍스트를 기억합니다.
다음 코드를 고려하세요.
record = Model.with(collection: 'other_collection') { Model.first } record.update(field: 'value')
Mongoid v9.0 이전에는 저장 옵션(여기서는 모델에 대한 대체 컬렉션 의 사양)이 기록 에서 기억되지 않기 때문에 앞의 코드는 자동으로 업데이트 실행에 실패했습니다. 따라서 기록 other_collection에서 로드되지만 업데이트되면 모델의 기본값 컬렉션 에서 문서 찾아 업데이트 시도합니다. 이 작업을 수행하려면 모든 업데이트 에 대해 컬렉션 명시적으로 지정해야 했습니다.
Mongoid v9.0부터, 명시적 저장 옵션에서 생성되거나 로드된 레코드는 해당 옵션(명명된 클라이언트, 다른 데이터베이스 또는 다른 컬렉션 포함)을 기억합니다.
레거시(v9.0 이전)가 필요한 경우 다음 플래그를 사용하여 활성화 할 수 있습니다.
Mongoid.legacy_persistence_context_behavior = true
Mongoid v9.0에서 이 플래그는 기본적으로 false입니다.