Mongoid 8.0
이 페이지의 내용
- MongoDB 3 을 지원합니다.4 및 이전 서버 삭제
- Ruby 2 를 지원합니다.5 삭제
- Rails 5 를 지원합니다.1 삭제
- 기본 옵션 값 변경됨
Decimal128
지원BigDecimal
필드- 캐스팅할 수 없는 값 저장/검색/진화
attributes_before_type_cast
해시 변경 사항- 콜백 호출 순서
Changeable
다음과 호환되는 모듈 동작ActiveModel::Dirty
*_previously_was
,previously_new_record?
및previously_persisted?
헬퍼- 알 수 없는 필드 유형 기호/문자열 금지
any_of
여러 인수를 최상위 조건으로 추가- 포함된 기준의
#pluck
가nil
값을 반환합니다. Mongoid::Criteria#geo_spacial
을(를)#geo_spatial
으)로 대체했습니다.Mongoid#Criteria
에.tally
메서드를 구현했습니다.Mongoid#Criteria
에.pick
메서드를 구현했습니다.- 차단이 주어질 때
find
은Enumerable#find
에게 위임합니다. - 유효하지 않은
belongs_to
연관 관계가 있는 문서를 더 이상 유지하지 않음 - 로컬 HABTM 연관 관계를 올바르게 업데이트합니다.
- BSON::바이너리 필드의 저장 문자열 수정
- 제거된
Document#to_a
메서드 - 인덱스에서
:drop_dups
옵션 제거 - 제거된
Mongoid::Errors::EagerLoad
예외 클래스 - 더 이상 사용되지 않는 상수 제거
- 제거된
Array#update_values
및Hash#update_values
메서드 geoHaystack
,geoSearch
옵션이 더 이상 사용되지 않습니다.- 의
:id_sort
옵션이 제거되었습니다.#first/last
- Mongoid::Criteria 캐시 제거
이 페이지에서는 Mongoid 의 중요한 변경 사항 및 개선 사항에 8 대해0 설명합니다. . 전체 릴리스 목록은 GitHub 에서 확인할 수 있습니다.JIRA에서 ; 자세한 릴리스 노트는 GitHub 릴리스를, 버그 수정을 포함하여 각 릴리스에서 수정된 전체 문제 목록은 JIRA를 참조하세요.
MongoDB 3 을 지원합니다.4 및 이전 서버 삭제
Mongoid 8 에는 MongoDB 3 이(가) 필요합니다.6 이상. 이전 서버 버전은 지원되지 않습니다.
Ruby 2 를 지원합니다.5 삭제
Mongoid 8 에는 Ruby 2 이(가) 필요합니다.6 이상. 이전 Ruby 버전은 지원되지 않습니다.
Rails 5 를 지원합니다.1 삭제
Mongoid 8 에는 Rails 5 이(가) 필요합니다.2 이상. 이전 Rails 버전은 지원되지 않습니다.
기본 옵션 값 변경됨
호환성이 손상되는 변경: Mongoid 8 에서 다음 옵션의 기본값이 변경되었습니다.0:
:broken_aggregables
=>false
:broken_alias_handling
=>false
:broken_and
=>false
:broken_scoping
=>false
:broken_updates
=>false
:compare_time_by_ms
=>true
:legacy_attributes
=>false
:legacy_pluck_distinct
=>false
:legacy_triple_equals
=>false
:object_id_as_json_oid
=>false
:overwrite_chained_operators
=>false
각 옵션에 대한 설명과 효과는 구성 옵션 을 참조하세요.
Decimal128
-backed BigDecimal
필드
Mongoid 8 에는 BigDecimal
유형의 필드에 할당된 값을 데이터베이스에 String
유형으로 저장하여 Mongoid 7 및 이전 버전과의 호환성을 유지할 수 있는 map_big_decimal_to_decimal128
기능 플래그가 도입되었습니다. Mongoid 8 에서 기본적으로(이 기능 플래그가 켜져 있음), BigDecimal
유형의 필드에 할당된 값은 데이터베이스에 BSON::Decimal128
유형으로 저장됩니다. Mongoid 7 이전 버전과 이 기능 플래그가 꺼진 Mongoid 8 에서는 BigDecimal
유형의 필드에 할당된 값이 문자열로 저장됩니다. 자세한 내용은 BigDecimal 필드 섹션을 참조하세요.
캐스팅할 수 없는 값 저장/검색/진화
호환성이 손상되는 변경: Mongoid 8 에서 Mongoid는 '캐스팅할 수 없는 값'의 저장, 검색 및 진화를 표준화합니다. 캐스팅할 수 없는 값을 읽거나 쓰려고 하면 대신 nil
가 반환되거나 기록됩니다. 캐스팅할 수 없는 값을 진화시키려고 하면 입력된 값이 반환됩니다. 자세한 내용은 캐스트할 수 없는 값 섹션을 참조하세요.
일부 mongoize
, demongoize
및 evolve
메서드도 Rails 및 다른 mongoize
, demongoize
및 evolve
메서드와 일관되게 수행되도록 변경되었습니다. 다음 표에는 기능 변경 사항이 나와 있습니다.
필드 유형 | 상황 | 이전 기능 | 새로운 기능 |
---|---|---|---|
부울 | 부울이 아닌 문자열이 할당된 경우: '가상 값' | 반환 false | 반환 nil |
배열/해시 | 배열이나 해시가 아닌 값이 할당된 경우 | InvalidValue 오류 발생 | 반환 nil |
세트 | 집합이 아닌 값이 할당된 경우: 1 | NoMethodError 예외 발생: 에 대한 정의되지 않은 메서드 to_a 1:Integer | 반환 nil |
정규 표현식 | 데이터베이스에서 정규식을 유지하고 읽을 때 | 반환 BSON::Regexp::Raw | 반환 Regexp |
시간/날짜/시간 | 허위 값을 할당하는 경우: :bogus | NoMethodError 발생 예외: bogos:Symbol에 대한 to_i 메서드가 정의되지 않았습니다. | 반환 nil |
시간/날짜/시간 | 시간이 아닌 값을 '위조'로 악용하는 경우, Date.today | NoMethodError 예외 발생: "bogos": 문자열에 대한 정의되지 않은 메서드 getlocal | "bogos": 반환
|
날짜 | 가짜 값을 할당하거나 악용하는 경우: :bogo | NoMethodError 발생 예외: bogos:Symbol에 대한 year 메서드가 정의되지 않았습니다. | 반환 nil |
시간/날짜시간/날짜 | 유효한 string을 악마화하는 경우: "2022-07-14 14:45:51 -0400" | NoMethodError 예외 발생: "2022-07-14 14:45:51 -0400": 문자열에 대한 정의되지 않은 메서드 getlocal | 반환 Time/DateTime/Date |
모든 유형 | 캐스팅할 수 없는 값이 할당되거나 악마화된 경우 | 정의되지 않은 동작, NoMethodError | 반환 nil |
모든 유형 | 캐스팅할 수 없는 값이 진화하는 경우 | 정의되지 않은 동작, NoMethodError | 입력 값 반환 |
참고
demongoize
컨테이너 객체(예: 해시, 배열)의 메서드는 해당 객체를 수정하고 저장할 때 버그를 방지하기 위해 변경되지 않았습니다.https://jira.mongodb.org/browse/MONGOID- 를2951 참조하세요. 를 참조하세요.
attributes_before_type_cast
해시 변경 사항
attributes_before_type_cast
해시가 ActiveRecord처럼 작동하도록 변경되었습니다.
매개 변수 없이 새 모델을 인스턴스화할 때
attributes_before_type_cast
해시는attributes
해시와 동일한 내용을 갖습니다. 매개변수가 이니셜라이저로 전달되면 해당 값은mongoized
되기 전에attributes_before_type_cast
해시에 저장됩니다.모델에 값을 할당할 때
mongoized
값(즉, '1 '을 Integer 필드에 할당할 때mongoized
~ 1)은attributes
해시에 저장되는 반면, 원시 값은 (즉, '1 ')는attributes_before_type_cast
해시에 저장됩니다.모델을 저장, 생성(예:
create!
메서드 사용) 또는 다시 로드할 때attributes_before_type_cast
해시가attributes
해시와 동일한 내용을 갖도록 재설정됩니다.데이터베이스에서 문서를 읽을 때
attributes_before_type_cast
해시에는demongoized
형식이 아닌 데이터베이스에 표시되는 속성이 포함됩니다.
콜백 호출 순서
호환성이 손상되는 변경: Mongoid 8.0 은 연관 관계가 있는 문서에 대한 _create 및 _save 콜백 호출 순서를 변경합니다.
참고 연관 관계(has_one
및 has_many
):
Mongoid 8.0 | Mongoid 7 |
---|---|
상위:before_save | 상위:before_save |
상위 : 주위에_저장_열기 | 상위 : 주위에_저장_열기 |
상위:before_create | 상위:before_create |
부모 :round_create_open | 부모 :round_create_open |
부모가 MongoDB에 지속됨 | 부모가 MongoDB에 지속됨 |
자식:before_save | 부모 :round_create_close |
자식 :round_save_open | 상위:after_create |
자식 :before_create | 자식:before_save |
자식 :round_create_open | 자식 :round_save_open |
자식 :before_create | |
자식 :round_create_open | |
자식이 MongoDB에 지속됨 | 자식이 MongoDB에 지속됨 |
자식 :round_create_close | 자식 :round_create_close |
자식 :after_create | 자식 :after_create |
자식 :round_save_close | 자식 :round_save_close |
자식 :after_save | 자식 :after_save |
부모 :round_create_close | 상위:round_save_close |
상위:after_create | 상위:after_save |
상위:round_save_close | |
상위:after_save |
임베디드 연결(embeds_one
및 embeds_many
):
Mongoid 8.0 | Mongoid 7 |
---|---|
상위:before_save | 자식:before_save |
상위 : 주위에_저장_열기 | 자식 :round_save_open |
상위:before_create | 자식 :round_save_close |
부모 :round_create_open | 자식 :after_save |
자식:before_save | 상위:before_save |
자식 :round_save_open | 상위 : 주위에_저장_열기 |
자식 :before_create | 자식 :before_create |
자식 :round_create_open | 자식 :round_create_open |
자식 :round_create_close | |
자식 :after_create | |
상위:before_create | |
부모 :round_create_open | |
MongoDB에 보존된 문서 | MongoDB에 보존된 문서 |
자식 :round_create_close | |
자식 :after_create | |
자식 :round_save_close | |
자식 :after_save | |
부모 :round_create_close | 부모 :round_create_close |
상위:after_create | 상위:after_create |
상위:round_save_close | 상위:round_save_close |
상위:after_save | 상위:after_save |
Changeable
다음과 호환되는 모듈 동작 ActiveModel::Dirty
이제 문서를 업데이트할 때 after_*
콜백에서 업데이트된 속성 값을 가져올 수 있습니다. 이는 ActiveRecord/ActiveModel 동작을 따릅니다.
class Cat include Mongoid::Document field :age, type: Integer after_save do p self p attribute_was(:age) end end a = Cat.create! a.age = 2 a.save!
Mongoid 8.0 출력:
#<Cat _id: 60aef1652c97a617438dc9bb, age: 2> 2
Mongoid 7 출력:
#<Cat _id: 60aef1652c97a617438dc9bb, age: 2> nil
7 attribute_was(:age)
에서는 이전 속성 값을 반환하고 8 에서는 이전 속성 값을 반환합니다.0 attribute_was(:age)
는 새 값을 반환합니다.
*_previously_was
, previously_new_record?
및 previously_persisted?
헬퍼
Mongoid 8.0 에는 ActiveModel 호환 *_previously_was
헬퍼와 ActiveRecord 호환 previously_new_record?
및 previously_persisted?
헬퍼가 도입되었습니다.
class User include Mongoid::Document field :name, type: String field :age, type: Integer end user = User.create!(name: 'Sam', age: 18) user.previously_new_record? # => true user.name = "Nick" user.save! user.name_previously_was # => "Sam" user.age_previously_was # => 18 user.previously_new_record? # => false user.destroy user.previously_persisted? # => true
알 수 없는 필드 유형 기호/문자열 금지
호환성이 손상되는 변경: Mongoid 8 는 기호 및 문자열이 알려진 유형에 매핑되지 않는 경우 필드 유형으로 기호 및 문자열을 사용하는 것을 금지합니다. 이전에는 이러한 사용으로 Object
유형의 필드가 생성되었습니다.
Mongoid 8 동작:
class User include Mongoid::Document field :name, type: :bogus # => raises Mongoid::Errors::InvalidFieldType end
Mongoid 7 동작:
class User include Mongoid::Document field :name, type: :bogus # Equivalent to: field :name end
any_of
여러 인수를 최상위 조건으로 추가
호환성이 손상되는 변경: 여러 조건과 함께 any_of
을(를) 호출하면 any_of
이(가) 단일 조건으로 호출되는 경우와 마찬가지로 조건이 기준의 최상위 수준에 추가됩니다. 이전에는 여러 조건이 제공되고 기준에 이미 $or
연산자가 있는 경우 새 조건이 기존 $or
에 추가 분기로 추가되었습니다.
Mongoid 8.0 동작:
Band.any_of({name: 'The Rolling Stones'}, {founded: 1990}). any_of({members: 2}, {last_tour: 1995}) # => # #<Mongoid::Criteria # selector: {"$or"=>[{"name"=>"The Rolling Stones"}, {"founded"=>1990}], # "$and"=>[{"$or"=>[{"members"=>2}, {"last_tour"=>1995}]}]} # options: {} # class: Band # embedded: false> Band.any_of({name: 'The Rolling Stones'}, {founded: 1990}).any_of({members: 2}) # => # #<Mongoid::Criteria # selector: {"$or"=>[{"name"=>"The Rolling Stones"}, {"founded"=>1990}], "members"=>2} # options: {} # class: Band # embedded: false>
Mongoid 7 동작:
Band.any_of({name: 'The Rolling Stones'}, {founded: 1990}). any_of({members: 2}, {last_tour: 1995}) # => # #<Mongoid::Criteria # selector: {"$or"=>[{"name"=>"The Rolling Stones"}, {"founded"=>1990}, # {"members"=>2}, {"last_tour"=>1995}]} # options: {} # class: Band # embedded: false> Band.any_of({name: 'The Rolling Stones'}, {founded: 1990}).any_of({members: 2}) # => # #<Mongoid::Criteria # selector: {"$or"=>[{"name"=>"The Rolling Stones"}, {"founded"=>1990}], "members"=>2} # options: {} # class: Band # embedded: false>
#pluck
포함된 기준에서 nil
값을 반환합니다.
Mongoid 8 는 내장된 문서에 대해 Mongoid::Criteria에서 #pluck
을 호출하면 nil 값이 삭제되는 버그를 수정합니다. 이 동작은 ActiveSupport의 #pluck
메서드 및 데이터베이스에서 문서를 읽을 때 #pluck
의 작동 방식과 일치하지 않습니다.
Mongoid 8.0 동작:
class Address include Mongoid::Document embedded_in :mall field :street, type: String end class Mall include Mongoid::Document embeds_many :addresses end mall = Mall.create! mall.addresses.create!(street: "Elm Street") mall.addresses.create!(street: nil) # Pluck from embedded document criteria mall.addresses.all.pluck(:street) #=> ['Elm Street', nil]
동일한 설정에서 Mongoid 7 동작:
# Pluck from embedded document criteria mall.addresses.all.pluck(:street) #=> ['Elm Street']
명확성을 기하기 위해 다음 동작은 Mongoid 7 에서 Mongoid 8 로 변경되지 않습니다.0:
# Pluck from database Mall.all.pluck('addresses.street') #=> [ ['Elm Street', nil] ] # Pluck using ActiveSupport Array#pluck mall.addresses.pluck(:street) #=> ['Elm Street', nil]
Mongoid::Criteria#geo_spacial
을(를) #geo_spatial
으)로 대체했습니다.
이전에 사용 중단된 Mongoid::Criteria#geo_spacial
메서드가 Mongoid 8 에서 제거되었습니다. Mongoid 7 에 추가된 #geo_spatial
와 일대일로 대체되었습니다.2.0.
Mongoid#Criteria
에 .tally
메서드를 구현했습니다.
Mongoid 8 은 Mongoid#Criteria
에서 .tally
메서드를 구현합니다. tally
은 필드 이름을 매개 변수로 사용하고 값에서 해당 개수로의 매핑을 반환합니다. 예를 들어 다음 모델을 살펴보겠습니다.
class User include Mongoid::Document field :age end
데이터베이스의 다음 문서입니다.
{ _id: 1, age: 21 } { _id: 2, age: 21 } { _id: 3, age: 22 }
연령 필드에서 tally
을 호출하면 다음과 같은 결과가 나타납니다.
User.tally("age") # => { 21 => 2, 22 => 1 }
tally
메서드는 점 표기법 및 필드 별칭을 허용합니다. 또한 현지화된 필드를 집계할 수도 있습니다.
Mongoid#Criteria
에 .pick
메서드를 구현했습니다.
Mongoid 8 은 Mongoid#Criteria
에서 .pick
메서드를 구현합니다. pick
는 하나 이상의 필드 이름을 매개 변수로 사용하고 하나의 문서에서 해당 필드에 대한 값을 반환합니다. 다음 모델을 고려하세요.
class User include Mongoid::Document field :age end
데이터베이스의 다음 문서입니다.
{ _id: 1, age: 21 } { _id: 2, age: 21 } { _id: 3, age: 22 }
연령 필드에서 pick
을 호출하면 다음과 같은 결과가 나타납니다.
User.pick(:age) # => 21
이 메서드는 문서에 정렬을 적용하지 않으므로, 첫 번째 문서의 값을 반드시 반환하지는 않습니다.
pick
메서드는 점 표기법 및 필드 별칭을 허용합니다. 또한 지역화된 필드를 선택할 수도 있습니다.
find
차단이 주어졌을 때 Enumerable#find
에 위임
인수 없이 _id
차단이 주어지면 find
이 Enumerable#find
에 위임합니다. 다음 모델을 고려하세요.
class Band include Mongoid::Document field :name, type: String end Band.create!(name: "Depeche Mode") Band.create!(name: "The Rolling Stones")
차단과 함께 find
를 호출하면 차단된 첫 번째 문서가 반환되며, 그 첫 번째 문서는 true
을 반환합니다.
Band.find do |b| b.name == "Depeche Mode" end # => #<Band _id: 62c58e383282a4cbe82bd74b, name: "Depeche Mode">
유효하지 않은 belongs_to
연관 관계가 있는 문서가 더 이상 유지되지 않습니다.
Mongoid 8 에서 유효하지 않은 문서가 belongs_to
연관 관계에 할당되고 기본 문서가 저장된 경우, belongs_to
연관 관계에 optional: false
또는 optional
옵션이 설정되지 않았고 글로벌 플래그가 belongs_to_required_by_default
가 참이면 문서와 관련 문서 모두 지속되지 않습니다. 예를 들어 다음 모델이 주어집니다.
class Parent include Mongoid::Document has_one :child field :name validates :name, presence: true end class Child include Mongoid::Document belongs_to :parent, autosave: true, validate: false, optional: false end child = Child.new parent = Parent.new child.parent = parent # parent is invalid, it does not have a name child.save
이 경우 자식과 부모 모두 영속화되지 않습니다.
참고
저장하면! 호출되면 유효성 검사 오류가 발생합니다.
optional이 false인 경우 자식은parent_id로 유지되지만 부모는 유지되지 않습니다.
child = Child.new parent = Parent.new child.parent = parent # parent is invalid, it does not have a name child.save p Child.first # => <Child _id: 629a50b0d1327aad89d214d2, parent_id: BSON::ObjectId('629a50b0d1327aad89d214d3')> p Parent.first # => nil
Mongoid 7 또는 8 및 이전 버전에서 두 문서의 기능이 유지되지 않도록 하려면 연관 관계에 validate: true
옵션을 설정할 수 있습니다. 하위 항목의 기능만 유지하려면 연관 관계에 validate:
false
옵션을 설정할 수 있습니다.
로컬 HABTM 연관 관계를 올바르게 업데이트합니다.
Mongoid 8 에서 지속형 요소를 HABTM 연관 관계로 푸시할 때, 이제 연관 관계는 다시 로드할 필요 없이 올바르게 업데이트됩니다. 예를 들면 다음과 같습니다.
class User include Mongoid::Document has_and_belongs_to_many :posts end class Post include Mongoid::Document has_and_belongs_to_many :users end user1 = User.create! user2 = User.create! post = user1.posts.create! p post.users.length # => 1 post.users << user2 p post.users.length # => 1 in Mongoid 7, 2 in Mongoid 8 p post.reload.users.length # => 2
이 예제에서 볼 수 있듯이 user2
을 사용자 배열에 푸시한 후 Mongoid 8 는 다시 로드하지 않고도 요소 수를 올바르게 업데이트합니다.
BSON::바이너리 필드의 저장 문자열 수정
호환성이 손상되는 변경: Mongoid 8 에서 string 유형의 BSON::Binary
필드에 string을 저장하면 데이터베이스에 로 저장되고 BSON::Binary
반환됩니다. Mongoid 8 이전에는 string으로 저장되고 반환되었습니다.
class Registry include Mongoid::Document field :data, type: BSON::Binary end registry = Registry.create!(data: "data!") p registry.data # => Mongoid 7: "data!" # => Mongoid 8: <BSON::Binary:0x2580 type=generic data=0x6461746121...> registry = Registry.find(registry.id) p registry.data # => Mongoid 7: "data!" # => Mongoid 8: <BSON::Binary:0x2600 type=generic data=0x6461746121...>
Document#to_a
메서드 제거
이전에 사용 중단된 Document#to_a
메서드가 Mongoid 8 에서 제거되었습니다.
인덱스에서 :drop_dups
옵션 제거
index
매크로에서 :drop_dups
옵션이 제거되었습니다. 이 옵션은 MongoDB Server 2 에만 해당됩니다.6 이하에서는 Mongoid가 더 이상 지원하지 않습니다.
Mongoid::Errors::EagerLoad
예외 클래스 제거
이전에 사용 중단된 Mongoid::Errors::EagerLoad
예외 클래스가 Mongoid 8 에서 제거되었습니다. 버전 7 이후 Mongoid에서 사용되지 않았습니다.1. 다형성 belongs_to
연관 관계에 대한 선행 로딩이 구현된 경우 1 .
더 이상 사용되지 않는 상수 제거
Mongoid 8 은 Mongoid 외부에서 사용되었을 것으로 예상되지 않는 다음과 같은 더 이상 사용되지 않는 상수를 제거합니다.
Mongoid::Extensions::Date::EPOCH
Mongoid::Extensions::Time::EPOCH
Mongoid::Factory::TYPE
Array#update_values
및 Hash#update_values
메서드 제거
이전에 더 이상 사용되지 않는 Array#update_values
및 Hash#update_values
메서드가 Mongoid 8 에서 제거되었습니다.
geoHaystack
geoSearch
옵션이 더 이상 사용되지 않습니다.
인덱스의 geoHaystack
및 geoSearch
옵션은 더 이상 사용되지 않습니다.
:id_sort
#first/last
의 옵션이 제거되었습니다.
#first
및 #last
옵션의 :id_sort
옵션에 대한 지원이 중단되었습니다. 이 메서드는 이제 위치 인수로서의 한도만 제외합니다.
Mongoid::Criteria 캐시 제거
Mongoid 8 에서 개별 캐싱 기준 객체에 대한 지원이 중단되었습니다.
캐싱 기능을 사용하려면 Mongoid 쿼리 캐시를 활성화하세요. 자세한 내용은 쿼리 캐시 섹션을 참조하세요.