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

Mongoid 9.0

이 페이지의 내용

이 페이지에서는 Mongoid 9.0 의 중요한 변경 사항과 개선 사항에 대해 설명합니다. 전체 릴리스 목록은 에서 확인할 수 Github 있습니다.JIRA에서 ; 자세한 Github 릴리스 노트는 릴리스를, 버그 수정을 포함하여 각 릴리스에서 수정된 전체 문제 목록은 JIRA를 참조하세요.

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 리포지토리 를 참조하세요. .

Mongoid 9 에는 Ruby 2.7 이상 또는 JRuby 9.4 이(가) 필요합니다. 이전 Ruby 및 JRuby 버전은 지원되지 않습니다.

Mongoid 9 에는 Rails 6.0 이상이 필요합니다. 이전 Rails 버전은 지원되지 않습니다.

더 이상 사용되지 않는 클래스 Mongoid::Errors::InvalidStorageParent 이(가) 제거되었습니다.

Mongoid 8.x 이전 버전에서는 사용자가 내장된 문서에 대해 around_* 콜백을 정의할 수 있습니다. 9.0 부터 이러한 콜백은 무시되며 실행되지 않습니다. 이러한 콜백이 정의되어 있으면 콘솔에 경고가 출력됩니다.

이전 동작을 복원 하려면 애플리케이션 에서 Mongoid.around_embedded_document_callbacks 을 true 로 설정하다 수 있습니다.

참고

내장된 문서에 대해 around_* 콜백을 활성화하는 것은 문서에 내장된 문서 가 많은 경우 SystemStackError 예외가 발생할 수 있으므로 권장하지 않습니다. MONGOID-5658 참조 를 참조하세요.

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 이(가) 제거되었습니다.

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 # => {}

Mongoid는 이제 Rails 콘솔 샌드박스 모드 를 지원합니다. Rails 콘솔이 --sandbox 플래그로 시작된 경우 Mongoid는 콘솔을 열기 전에 :default 클라이언트 에서 트랜잭션 을 시작합니다. 이 트랜잭션 은 커밋되지 않습니다. 따라서 :default 클라이언트 를 사용하여 콘솔에서 실행되는 모든 명령은 데이터베이스 에 유지되지 않습니다.

참고

default 이외의 다른 클라이언트를 사용하여 샌드박스 모드에서 명령을 실행하는 경우 이러한 변경 사항은 평소대로 유지됩니다.

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"))

인스턴스가 로드될 때 .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 로 변경하세요. 또한 AttributeNotLoadedMongoid::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 버전에서는 지속성 작업 중에 날짜를 시간으로 타입캐스팅할 때 이미 구역 를 올바르게 사용하고 있었습니다.

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 메서드는 여러 수준의 중첩된 내장된 문서를 사용하는 경우에도 상위 문서 당 하나의 지속성 작업을 수행하도록 최적화되었습니다.

관계에 touch: false 을 명시적으로 설정하지 않는 한 포함된 하위 문서를 업데이트하면 이제 자동으로 상위 문서를 터치합니다.

class Address
include Mongoid::Document
include Mongoid::Timestamps
embedded_in :mall, touch: false
end

다른 모든 연결의 경우 기본값 은 touch: false 로 유지됩니다.

Mongoid 8.1 에서 #upsert 메서드에 :replace 옵션을 추가했습니다. 이 옵션은 기존 문서 를 업데이트하거나 교체할지 여부를 지정하는 데 사용되었습니다.

Mongoid 9.0 은 이 플래그의 기본값 을 true => false 에서 뒤집습니다.

즉, 기본값 으로 Mongoid 9 는 기존 문서 를 업데이트 하고 이를 대체하지 않습니다.

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 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 및 이전 버전에서는 설정을 완전히 무시합니다.

이제 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 객체 또는 표준 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 하면 를 구현하는 숫자나 이 아닌 값은 string BigDecimal MONGOID- 가 아닌5507 을 반환합니다. .

  • ActiveJob 인수 MONGOID- 로 전달될 때 BSON ::ObjectId 값의5611 직렬화 및 역직렬화에 대한 지원 이 추가되었습니다. .

돌아가기

Mongoid 업그레이드