문서 메뉴

문서 홈몽고이드

Mongoid 8.0

이 페이지의 내용

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

Mongoid 8 에는 MongoDB 3 이(가) 필요합니다.6 이상. 이전 서버 버전은 지원되지 않습니다.

Mongoid 8 에는 Ruby 2 이(가) 필요합니다.6 이상. 이전 Ruby 버전은 지원되지 않습니다.

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

각 옵션에 대한 설명과 효과는 구성 옵션 을 참조하세요.

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, demongoizeevolve 메서드도 Rails 및 다른 mongoize, demongoizeevolve 메서드와 일관되게 수행되도록 변경되었습니다. 다음 표에는 기능 변경 사항이 나와 있습니다.

필드 유형
상황
이전 기능
새로운 기능
부울
부울이 아닌 문자열이 할당된 경우: '가상 값'
반환 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": 반환 nil

Date.today: return Time/DateTime

날짜
가짜 값을 할당하거나 악용하는 경우: :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 해시가 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_onehas_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_oneembeds_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

이제 문서를 업데이트할 때 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) 는 새 값을 반환합니다.

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 이(가) 단일 조건으로 호출되는 경우와 마찬가지로 조건이 기준의 최상위 수준에 추가됩니다. 이전에는 여러 조건이 제공되고 기준에 이미 $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>

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 메서드가 Mongoid 8 에서 제거되었습니다. Mongoid 7 에 추가된 #geo_spatial 와 일대일로 대체되었습니다.2.0.

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 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 메서드는 점 표기법 및 필드 별칭을 허용합니다. 또한 지역화된 필드를 선택할 수도 있습니다.

인수 없이 _id 차단이 주어지면 findEnumerable#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">

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 옵션을 설정할 수 있습니다.

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 는 다시 로드하지 않고도 요소 수를 올바르게 업데이트합니다.

호환성이 손상되는 변경: 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 메서드가 Mongoid 8 에서 제거되었습니다.

index 매크로에서 :drop_dups 옵션이 제거되었습니다. 이 옵션은 MongoDB Server 2 에만 해당됩니다.6 이하에서는 Mongoid가 더 이상 지원하지 않습니다.

이전에 사용 중단된 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_valuesHash#update_values 메서드가 Mongoid 8 에서 제거되었습니다.

인덱스의 geoHaystackgeoSearch 옵션은 더 이상 사용되지 않습니다.

#first#last 옵션의 :id_sort 옵션에 대한 지원이 중단되었습니다. 이 메서드는 이제 위치 인수로서의 한도만 제외합니다.

Mongoid 8 에서 개별 캐싱 기준 객체에 대한 지원이 중단되었습니다.

캐싱 기능을 사용하려면 Mongoid 쿼리 캐시를 활성화하세요. 자세한 내용은 쿼리 캐시 섹션을 참조하세요.

← Mongoid 8.1