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

New in version 9.0.3.

You can use the Mongoid::Threaded.get and Mongoid::Threaded.set methods to query and modify thread-local variables. To learn when to use these methods, see the Thread-Local Variables section of the Callbacks guide.

New in version 9.0.7.

You can use the Mongoid.allow_duplicate_index_declarations configuration option to send index verification to the server. If a duplicate index is declared, the server raises an error. To learn more, see the 구성 옵션 section of the Application Configuration guide.

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입니다.

이 페이지의 내용