새로운 기능
이 페이지의 내용
다음 버전의 새로운 기능에 대해 알아보세요:
릴리스 목록 및 자세한 출시하다 노트를 보려면 Github 의 Mongoid 릴리스 를 참조하세요.
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
이(가) 제거되었습니다.
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
이(가) 구성된 구역 를 래핑하는 시간 객체 또는 표준 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입니다.