Mongoid 9.0
이 페이지의 내용
- Mongoid용 Railsmdb
- Ruby 2.6 및 JRuby 9.3 지원 삭제됨
- Rails 5 에 대한 지원이 중단되었습니다.
- 더 이상 사용되지 않는 클래스
Mongoid::Errors::InvalidStorageParent
제거됨 around_*
내장된 문서에 대한 콜백은 이제 무시됩니다.for_js
메서드는 더 이상 사용되지 않습니다.- 더 이상 사용되지 않는 옵션 제거
- 더 이상 사용되지 않는 기능 제거
touch
이제 메서드가 변경된 상태 를 지웁니다.- Rails 콘솔용 샌드박스 모드
- 새로운 트랜잭션 API
- 내장된 문서는 항상 상위 지속성 컨텍스트를 사용합니다.
- 쿼리에 원시 값 전달 지원
- 쿼리 프로젝션 에서 생략된 필드에 액세스할 때 AttributeNotLoaded 오류 발생
- 구성된 표준 시간대를 사용하여 쿼리에서 날짜를 시간으로 타입캐스트
- 내장된 문서의
`#touch
메서드가touch: false
옵션을 올바르게 처리합니다. embedded_in
이제 연관 관계의 기본값은touch: true
#upsert
의:replace
옵션에 대한 기본값 반전- 이제
_id
필드의 불변성이 적용됩니다. - 인덱스 옵션에서 필드 별칭 지원
- BSON 5 및 BSON::Decimal128 필드
- MongoDB Atlas 로 검색 인덱스 관리
Time.configured
제거되었습니다.- 이제 레코드가 로드/생성된 지속성 컨텍스트를 기억합니다.
- 버그 수정 및 개선 사항
이 페이지에서는 Mongoid 9.0 의 중요한 변경 사항과 개선 사항에 대해 설명합니다. 전체 릴리스 목록은 에서 확인할 수 Github 있습니다.JIRA에서 ; 자세한 Github 릴리스 노트는 릴리스를, 버그 수정을 포함하여 각 릴리스에서 수정된 전체 문제 목록은 JIRA를 참조하세요.
Mongoid용 Railsmdb
Mongoid 9.0 출시하다 와 함께 Rails 애플리케이션을 생성, 업데이트, 관리 및 유지 관리할 수 있는 새로운 명령줄 유틸리티도 정식 출시되었습니다!
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 리포지토리 를 참조하세요. .
Ruby 2.6 및 JRuby 9.3 지원 삭제됨
Mongoid 9 에는 Ruby 2.7 이상 또는 JRuby 9.4 이(가) 필요합니다. 이전 Ruby 및 JRuby 버전은 지원되지 않습니다.
Rails 5 에 대한 지원이 중단되었습니다.
Mongoid 9 에는 Rails 6.0 이상이 필요합니다. 이전 Rails 버전은 지원되지 않습니다.
더 이상 사용되지 않는 클래스 Mongoid::Errors::InvalidStorageParent
이(가)제거되었습니다.
더 이상 사용되지 않는 클래스 Mongoid::Errors::InvalidStorageParent
이(가) 제거되었습니다.
around_*
내장된 문서에 대한 콜백은 이제 무시됩니다.
Mongoid 8.x 이전 버전에서는 사용자가 내장된 문서에 대해 around_*
콜백을 정의할 수 있습니다. 9.0 부터 이러한 콜백은 무시되며 실행되지 않습니다. 이러한 콜백이 정의되어 있으면 콘솔에 경고가 출력됩니다.
이전 동작을 복원 하려면 애플리케이션 에서 Mongoid.around_embedded_document_callbacks
을 true 로 설정하다 수 있습니다.
참고
내장된 문서에 대해 around_*
콜백을 활성화하는 것은 문서에 내장된 문서 가 많은 경우 SystemStackError
예외가 발생할 수 있으므로 권장하지 않습니다. MONGOID-5658 참조 를 참조하세요.
for_js
메서드는 더 이상 사용되지 않습니다.
for_js
메서드는 더 이상 사용되지 않으며 Mongoid 10.0 에서 제거될 예정입니다.
더 이상 사용되지 않는 옵션 제거
주요 변경 사항: 다음 구성 옵션이 Mongoid 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
버전 7.5 및 이전 버전에 대한 지원이 중단되었습니다(최소 버전 8.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
이(가) 제거되었습니다.
touch
이제 메서드가 변경된 상태 를 지웁니다.
Mongoid 8.x 및 이전 touch
메서드에서는 모델이 변경된 상태 로 유지됩니다.
# Mongoid 8.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]}
9.0 부터 시작하여 Mongoid는 이제 touch
메서드를 사용한 후 변경된 상태 를 올바르게 지웁니다.
# Mongoid 9.0 behaviour band = Band.create! band.touch band.changed? # => false band.changes # => {}
Rails 콘솔용 샌드박스 모드
Mongoid는 이제 Rails 콘솔 샌드박스 모드 를 지원합니다. Rails 콘솔이 --sandbox
플래그로 시작된 경우 Mongoid는 콘솔을 열기 전에 :default
클라이언트 에서 트랜잭션 을 시작합니다. 이 트랜잭션 은 커밋되지 않습니다. 따라서 :default
클라이언트 를 사용하여 콘솔에서 실행되는 모든 명령은 데이터베이스 에 유지되지 않습니다.
참고
default 이외의 다른 클라이언트를 사용하여 샌드박스 모드에서 명령을 실행하는 경우 이러한 변경 사항은 평소대로 유지됩니다.
새로운 트랜잭션 API
Mongoid 9.0 은 ActiveRecord에서 영감을 받은 새로운 트랜잭션 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 8.x 이전 버전에서는 사용자가 내장된 문서 의 지속성 컨텍스트를 지정할 수 있습니다( store_in
매크로 사용). Mongoid 9.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
는 상속하지 않습니다.
구성된 표준 시간대를 사용하여 쿼리에서 날짜를 시간으로 타입캐스트
날짜 값을 사용하여 시간 필드를 쿼리할 때 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 버전에서는 지속성 작업 중에 날짜를 시간으로 타입캐스팅할 때 이미 구역 를 올바르게 사용하고 있었습니다.
`#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
로 유지됩니다.
의 옵션에 대한 기본값 반전 :replace
#upsert
Mongoid 8.1 에서 #upsert
메서드에 :replace
옵션을 추가했습니다. 이 옵션은 기존 문서 를 업데이트하거나 교체할지 여부를 지정하는 데 사용되었습니다.
Mongoid 9.0 은 이 플래그의 기본값 을 true
=> false
에서 뒤집습니다.
즉, 기본값 으로 Mongoid 9 는 기존 문서 를 업데이트 하고 이를 대체하지 않습니다.
이제 필드 의 _id
불변성이 적용됩니다.
Mongoid 9.0 이전에는 문서가 최상위 문서인지 내장된 문서인지, 그리고 업데이트 수행 방식에 따라 _id
필드를 변경하는 것이 일관되지 않게 동작했습니다. 9.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 9.0 이전에는 저장 옵션(여기서는 모델에 대한 대체 컬렉션의 사양)이 기록에서 기억되지 않기 때문에 업데이트 실행에 자동으로 실패할 수 있었습니다. 따라서 레코드는 'other_collection'에서 로드되지만 업데이트되면 모델의 기본 컬렉션에서 문서를 찾아 업데이트하려고 시도합니다. 이 작업을 수행하려면 모든 업데이트에 대해 컬렉션을 명시적으로 지정해야 했습니다.
Mongoid 9.0 부터 명시적 저장 옵션으로 생성되거나 로드된 레코드는 해당 옵션(명명된 클라이언트, 다른 데이터베이스 또는 다른 컬렉션 포함)을 기억합니다.
레거시( 9.0 이전)가 필요한 경우 다음 플래그를 활성화 할 수 있습니다.
Mongoid.legacy_persistence_context_behavior = true
Mongoid 9 에서 이 플래그의 기본값은 false 입니다.
버그 수정 및 개선 사항
이 섹션에서는 사소한 버그 수정 및 개선 사항에 대해 설명합니다.
.unscoped
이제 메서드는.with_scope
MONGOID- 를 사용하여5214 선언된 범위도 지웁니다. .를 로 진화시킬
String
BigDecimal
때(즉,BigDecimal
객체 가 있는 필드 를 쿼리하는 경우)String
map_big_decimal_to_decimal128
플래그가 true로 설정하다 되면 변환은 가BSON::Decimal128
아닌 를String
반환합니다.MONGOID- .5484기본값 범위 가 MONGOID-4960 인 문서 클래스에서 을(를) 호출할 때 새로운 오류 이(가)
Mongoid::Errors::InvalidEstimatedCountCriteria
estimated_document_count
생성되었습니다. .이제 Mongoid는 모든 경우에 유효성 검사에 프라이머리 읽기를 사용합니다.MONGOID-5150.
현지화된 필드 변환 해시 MONGOID-5334 의 기호 키에 대한 지원 추가 .
인덱스 와일드카드 옵션 MONGOID-5388 추가 .
map_big_decimal_to_decimal128
플래그를 false로demongoizing
string 설정하다:to_d
하면 를 구현하는 숫자나 이 아닌 값은 stringBigDecimal
MONGOID- 가 아닌5507 을 반환합니다. .ActiveJob 인수 MONGOID- 로 전달될 때 BSON ::ObjectId 값의5611 직렬화 및 역직렬화에 대한 지원 이 추가되었습니다. .