Docs Menu

새로운 기능

이 페이지의 내용

다음 버전의 새로운 기능에 대해 알아보세요:

릴리스 목록 및 자세한 출시하다 노트를 보려면 Github 의 Mongoid 릴리스 를 참조하세요.

9.0 출시하다 에는 다음과 같은 새로운 기능, 개선 사항 및 수정 사항이 포함되어 있습니다.

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

Mongoid v9.0 Ruby 2.7 이상 또는 JRuby 9.4이 필요합니다. 이전 Ruby 및 JRuby 버전은 지원되지 않습니다.

Mongoid v9.0 Rails 6.0 이상이 필요합니다. 이전 Rails 버전은 지원되지 않습니다.

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

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

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

참고

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

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

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

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

참고

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

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

인스턴스가 로드될 때 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 버전에서는 지속성 작업 중에 DateTime 로 타입캐스팅하는 것이 이미 구역 올바르게 사용하고 있었습니다.

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 v8.1 upsert 메서드에 :replace 옵션을 추가했습니다. 이 옵션은 기존 문서 업데이트하거나 교체할지 여부를 지정하는 데 사용되었습니다.

Mongoid v9.0 이 플래그의 기본값 true 에서 false로 전환합니다. 즉, 기본값 으로 Mongoid v9.0 기존 문서 업데이트하고 대체하지 않습니다.

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 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 이(가) 구성된 구역 를 래핑하는 시간 객체 또는 표준 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입니다.

이 페이지의 내용