모듈: Mongoid::Atomic

확장자:
ActiveSupport::Concern
포함 항목:
컴포저블, Contextual::Mongo
다음에 정의됨:
lib/mongoid/atomic.rb,
lib/mongoid/atomic/modifiers.rb,
lib/mongoid/atomic/paths/root.rb,
lib/mongoid/atomic/paths/embedded.rb,
lib/mongoid/atomic/paths/embedded/one.rb,
lib/mongoid/atomic/paths/embedded/many.rb

개요

이 모듈에는 데이터베이스 에 대한 원자 조작을 지원하기 위한 로직이 포함되어 있습니다.

네임스페이스 아래에 정의됨

모듈: 경로 클래스: Modifiers

상수 요약 접기

UPDATES =
%i[
  atomic_array_pushs
  atomic_array_pulls
  atomic_array_add_to_sets
  atomic_pulls
  delay_atomic_sets
  delay_atomic_pulls
  delay_atomic_unsets
].동결

인스턴스 메서드 요약 접기

인스턴스 메서드 세부 정보

#add_atomic_pull(문서) ⇒ 객체

문서 를 원자적 풀로 추가합니다.

예시:

원자적 pull을 추가합니다.

person.add_atomic_pull(address)

매개변수:

  • 문서 (문서)

    가져올 내장된 문서입니다.



34
35
36
37
38
39
# 파일 'lib/mongoid/atomic.rb', 줄 34

def add_atomic_pull(문서)
  문서.flagged_for_destory = true
   = 문서.association_name.to_s
  delay_atomic_pulls[] ||= []
  delay_atomic_pulls[] << 문서
end

#add_atomic_unset(document) ⇒ Array<Document>

문서에 대한 원자적 unset을 추가합니다.

예시:

원자적 unset을 추가합니다.

document.add_atomic_unset(doc)

매개변수:

  • 문서 (문서)

    하위 문서.

반환합니다:



49
50
51
52
53
54
# 파일 'lib/mongoid/atomic.rb', 줄 49

def add_atomic_unset(문서)
  문서.flagged_for_destory = true
   = 문서.association_name.to_s
  delay_atomic_unsets[] ||= []
  delay_atomic_unsets[] << 문서
end

#atomic_array_add_to_setsHash

배열 필드의 경우 이러한 작업이 수행되어야 하는 고유한 추가 작업이 있습니다.

예시:

배열의 고유 추가를 가져옵니다.

person.atomic_array_add_to_sets

반환합니다:

  • (해시)

    배열 add_to_sets.



92
93
94
# 파일 'lib/mongoid/atomic.rb', 줄 92

def atomic_array_add_to_sets
  @atomic_array_add_to_sets ||= {}
end

#atomic_array_pulls해시

배열 필드의 경우 다음과 같은 상황이 발생해야 합니다.

예시:

배열 을 가져옵니다.

person.atomic_array_pulls

반환합니다:

  • (해시)

    배열 이 당깁니다.



82
83
84
# 파일 'lib/mongoid/atomic.rb', 줄 82

def atomic_array_pulls
  @atomic_array_pulls ||= {}
end

#atomic_array_pushes해시

배열 필드의 경우 발생해야 하는 푸시입니다.

예시:

배열 푸시를 가져옵니다.

person.atomic_array_pushes

반환합니다:

  • (해시)

    배열이 푸시합니다.



72
73
74
# 파일 'lib/mongoid/atomic.rb', 줄 72

def atomic_array_pushs
  @atomic_array_pushs ||= {}
end

#atomic_attribute_name(name) ⇒ string

수정할 속성의 경로를 반환합니다.

예시:

속성의 경로 가져오기

address.atomic_attribute_name(:city)

반환합니다:

  • (string)

    데이터베이스 의 문서 속성 경로



62
63
64
# 파일 'lib/mongoid/atomic.rb', 줄 62

def atomic_attribute_name(이름)
  임베디드? ? "#{atomic_position}.#{name}" : 이름
end

#atomic_delete_modifierString

문서 에 대한 제거 수정자를 가져옵니다. 루트 문서에서는 nil, embeddeds_one에서는 $unset, embeddeds_many에서는 $ 설정하다 됩니다.

예시:

제거 연산자 를 가져옵니다.

name.atomic_delete_modifier

반환합니다:

  • (string)

    가져오기 또는 설정 해제 작업입니다.



139
140
141
# 파일 'lib/mongoid/atomic.rb', 줄 139

def atomic_delete_modifier
  atomic_paths.delete_modifier
end

#atomic_insert_modifierString

문서 의 삽입 수정자를 가져옵니다. 루트 문서에서는 nil, embeddeds_one에서는 $, embeddeds_many에서는 $push가 설정하다 됩니다.

예시:

삽입 작업을 가져옵니다.

name.atomic_insert_modifier

반환합니다:

  • (string)

    pull 또는 설정하다 연산자 입니다.



150
151
152
# 파일 'lib/mongoid/atomic.rb', 줄 150

def atomic_insert_modifier
  atomic_paths.insert_modifier
end

#atomic_pathstring

Document 의 경로를 JSON 표기법으로 반환하며, MongoDB 에서 $ 설정하다 을(를) 통해 원자성 업데이트에 사용됩니다.

예시:

이 문서 의 경로를 가져옵니다.

address.atomic_path

반환합니다:

  • (string)

    데이터베이스에 있는 문서의 경로입니다.



161
162
163
# 파일 'lib/mongoid/atomic.rb', 줄 161

def atomic_path
  atomic_paths.경로
end

#atomic_paths객체

이 문서에 대한 원자 경로 유틸리티를 가져옵니다.

예시:

원자 경로를 가져옵니다.

document.atomic_paths

반환합니다:

  • (객체)

    연결된 경로입니다.



181
182
183
184
185
186
187
188
189
190
191
# 파일 'lib/mongoid/atomic.rb', 줄 181

def atomic_paths
  반환 @atomic_paths 만약 @atomic_paths

  경로 = 만약 _association
            _association.경로(self)
          other
            원자::경로::루트.신규(self)
          end

  경로. { @atomic_paths = 경로 하지 않는 한 new_record? }
end

#atomic_positionstring

수정할 문서 의 위치 연산자 를 반환합니다.

예시:

위치 연산자 를 가져옵니다.

address.atomic_position

반환합니다:

  • (string)

    인덱스가 있는 위치 연산자입니다.



171
172
173
# 파일 'lib/mongoid/atomic.rb', 줄 171

def 원자 위치
  atomic_paths.직위
end

#atomic_pullsArray<Hash>

가져와야 하는 모든 속성을 가져옵니다.

예시:

잡아당깁니다.

person.atomic_pulls

반환합니다:

  • (Array<Hash>)

    $pullAll 작업.



199
200
201
202
203
204
205
206
207
208
209
210
# 파일 'lib/mongoid/atomic.rb', 줄 199

def atomic_pulls
  pulls = {}
  delay_atomic_pulls.각각의 쌍 do |_, 참고자료|
    경로 = nil
    ID = 참고자료.map do |doc|
      경로 ||= doc.flag_as_destroyed
      doc._id
    end
    pulls[경로] = { '_id' => { '$in' => ID } } 개인정보 정책에 경로 = nil
  end
  pulls
end

#atomic_pushes해시

발생해야 하는 모든 푸시 속성을 가져옵니다.

예시:

푸시를 가져옵니다.

person.atomic_pushes

반환합니다:

  • (해시)

    $push 및 $each 작업.



218
219
220
# 파일 'lib/mongoid/atomic.rb', 줄 218

def atomic_pushes
  푸시 가능? ? { 원자 위치 => as_attributes } : {}
end

#atomic_sets해시

설정해야 하는 모든 속성을 가져옵니다.

예시:

세트를 가져옵니다.

person.atomic_sets

반환합니다:

  • (해시)

    $set 작업.



228
229
230
231
232
233
234
235
236
# 파일 'lib/mongoid/atomic.rb', 줄 228

def atomic_sets
  만약 업데이트 가능?
    세터
  elsif 설정 가능?
    { atomic_path => as_attributes }
  other
    {}
  end
end

#atomic_unsetsArray<Hash>

설정을 해제해야 하는 모든 속성을 가져옵니다.

예시:

언셋을 가져옵니다.

person.atomic_unsets

반환합니다:

  • (Array<Hash>)

    $unset 작업.



244
245
246
247
248
249
250
251
252
253
254
# 파일 'lib/mongoid/atomic.rb', 줄 244

def atomic_unsets
  Unsets = []
  delay_atomic_unsets.각각의 쌍 do |이름, 참고자료|
    경로 = nil
    참고자료. do |doc|
      경로 ||= doc.flag_as_destroyed
    end
    Unsets.push(경로 || 이름)
  end
  Unsets
end

#atomic_updates(_use_indexes = false) ⇒ 해시 _updates 라고도 함

참고:

MongoDB 는 단일 작업으로 '상충하는 수정'을 수행하는 것을 허용하지 않습니다. 충돌하는 수정 사항은 MongoDB 의 'haveConflictingMod' 함수에 의해 감지됩니다. 코드를 살펴보면 다음과 같은 경우 두 가지 수정 사항( 예시 : $ 설정하다 과 $each 를 사용한 $push )이 충돌하는 것으로 나타났습니다.

(1) the key paths being modified are equal.
(2) one key path is a prefix of the other.

따라서 $ 설정하다 '주소.0.street'는 'addresses'에 대한 $push 및 $each와 충돌하므로 업데이트 를 두 부분으로 분할 해야 합니다. 그러나 MongoDB의 로직을 정확히 일치시키려고 시도하지는 않습니다. 대신 두 키 경로의 첫 번째 구성 요소가 일치하면 두 업데이트가 충돌한다고 가정합니다.

현재 Document 에 대해 발생해야 하는 모든 원자성 업데이트를 가져옵니다. 여기에는 저장 호출이 이루어진 위치 아래에 있는 전체 계층 구조에서 발생해야 하는 모든 변경 사항이 포함됩니다.

Rubocop:Disable 스타일/OptionalBooleanParameter

예시:

필요한 업데이트를 가져옵니다.

person.atomic_updates(children)

반환합니다:

  • (해시)

    업데이트 및 해당 수정자.



119
120
121
122
123
124
125
126
127
128
# 파일 'lib/mongoid/atomic.rb', 줄 119

def atomic_updates(_use_indexes = 거짓)
  process_flagged_destorys
  mods = Modifiers.신규
  generate_atomic_updates(mods, self)
  _descendants. do |자식|
    자식.process_flagged_destorys
    generate_atomic_updates(mods, 자식)
  end
  mods
end

#delay_atomic_pulls해시

보류 중인 원자성 풀의 해시를 가져옵니다.

예시:

원자적 당김을 가져옵니다.

document.delayed_atomic_pulls

반환합니다:

  • (해시)

    이름/문서 쌍.



272
273
274
# 파일 'lib/mongoid/atomic.rb', 줄 272

def delay_atomic_pulls
  @delayed_atomic_pulls ||= {}
end

#delay_atomic_sets해시

저장이 지연된 모든 원자 세트를 가져옵니다.

예시:

지연된 원자 세트를 가져옵니다.

person.delayed_atomic_sets

반환합니다:

  • (해시)

    지연된 $sets.



262
263
264
# 파일 'lib/mongoid/atomic.rb', 줄 262

def delay_atomic_sets
  @delayed_atomic_sets ||= {}
end

#delay_atomic_unsets해시

지연된 원자적 언셋을 가져옵니다.

예시:

지연된 원자적 언셋을 가져옵니다.

document.delayed_atomic_unsets

반환합니다:

  • (해시)

    원자적 언셋



282
283
284
# 파일 'lib/mongoid/atomic.rb', 줄 282

def delay_atomic_unsets
  @delayed_atomic_unsets ||= {}
end

#flag_as_destroyedstring

문서 에 폐기됨으로 플래그를 지정하고 원자 경로를 반환합니다.

예시:

플래그가 파괴되고 경로를 반환합니다.

document.flag_as_destroyed

반환합니다:

  • (string)

    원자 경로.



292
293
294
295
296
# 파일 'lib/mongoid/atomic.rb', 줄 292

def flag_as_destroyed
  self.파괴됨 = true
  self.flagged_for_destory = 거짓
  atomic_path
end

#플래그가 지정된_destorysArray<Proc>

플래그가 지정된 폐기를 가져옵니다.

예시:

플래그가 지정된 폐기를 가져옵니다.

document.flagged_destroys

반환합니다:

  • (Array<Proc>)

    플래그가 지정된 항목은 파기합니다.



304
305
306
# 파일 'lib/mongoid/atomic.rb', 줄 304

def 플래그가 지정된_삭제
  @flaged_destorys ||= []
end

#process_flagged_destroys배열

중첩된 속성에서 보류 중인 플래그가 지정된 모든 삭제를 처리합니다.

예시:

플래그가 지정된 보류 중인 모든 파기를 처리합니다.

document.process_flagged_destroys

반환합니다:

  • (배열)

    삭제된 배열 입니다.



314
315
316
317
318
319
# 파일 'lib/mongoid/atomic.rb', 줄 314

def process_flagged_destorys
  _assigning do
    플래그가 지정된_삭제.(&:call)
  end
  플래그가 지정된_삭제.지우기
end