모듈: Mongoid::Tasks::Database

확장자:
Database
포함 항목:
Database
다음에 정의됨:
lib/mongoid/tasks/ 데이터베이스.rb

개요

데이터베이스 컬렉션, 인덱스, 샤딩 등을 관리 유틸리티 모듈입니다. Rake 작업에서 호출됩니다.

인스턴스 메서드 요약 접기

인스턴스 메서드 세부 정보

#create_collections(models = ::Mongoid.models, force: false) ⇒ 객체

제공된 glob이 주어지면 각 모델에 대한 컬렉션을 생성하면 클래스가 포함되지 않습니다.

매개변수:

  • 모델. (Array<Mongoid::Document>)

    컬렉션을 생성해야 하는 문서 클래스의 배열입니다. 기본값은 애플리케이션 의 모든 문서 클래스입니다.

  • force (true | false) (기본값은 false)

    true인 경우 이 메서드는 새 컬렉션을 만들기 전에 기존 컬렉션을 삭제합니다. false인 경우 이 메서드는 데이터베이스 에 존재하지 않는 새 컬렉션 만 생성합니다.



21
22
23
24
25
26
27
28
29
30
31
32
33
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 21

def create_collections(모델 = ::몽고이드.모델, force: 거짓)
  모델. do |모델|
    만약 !모델.임베디드? || 모델.주기적?
      모델.create_collection(force: force)
      로거.정보("MONGOID :#{모델}에 대한 컬렉션 생성:")
    other
      로거.정보("MONGOID: collection options 무시된 on: #{모델}, 루트 모델에서 정의하세요.")
    end
  구출 예외
    로거.오류 "#{ 모델}컬렉션 을 만드는 동안 오류가발생했습니다 ."
    올리다
  end
end

#create_indexes(models = ::Mongoid.models) ⇒ Array<Class>

제공된 glob이 주어지면 각 모델에 대한 인덱스를 생성하며 클래스는 포함되지 않습니다.

예시:

모든 인덱스를 생성합니다.

Mongoid::Tasks::Database.create_indexes

반환합니다:

  • (Array<Class>)

    인덱싱된 모델.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 42

def create_indexes(모델 = ::몽고이드.모델)
  모델. do |모델|
    다음 만약 모델.index_specations.비어 있나요?
    만약 !모델.임베디드? || 모델.주기적?
      모델.create_indexes
      로거.정보("MONGOID:#{모델}에 인덱스 생성:")
      모델.index_specations. do |사양|
        로거.정보("MONGOID: 인덱스: #{사양.}, 옵션: #{사양.옵션}")
      end
      모델
    other
      로거.정보("MONGOID: 인덱스 무시됨: #{모델}, 루트 모델에서 정의하세요.")
      nil
    end
  end.컴팩트
end

#create_search_indexes(models = ::Mongoid.models, wait: true) ⇒ 객체

생성할 검색 인덱스에 대한 요청을 제출합니다. 이 작업은 비동기적으로 수행됩니다. "대기"가 참이면 인덱스가 생성될 때까지 기다리는 동안 메서드가 차단 됩니다.

매개변수:

  • 모델 (Array<Mongoid::Document>) (기본값: ::Mongoid.models)

    검색 인덱스를 빌드 할 모델입니다.

  • wait (true | false) (기본값: true)

    인덱스가 빌드될 때까지 기다릴지 여부입니다.



67
68
69
70
71
72
73
74
75
76
77
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 67

def create_search_indexes(모델 = ::몽고이드.모델, wait: true)
  searchable = 모델.SELECT { |m| m.search_index_specs.어떤? }

  # 검색 인덱스 생성 요청을 대기열에 추가합니다.
  index_names_by_model = searchable.each_with_object({}) do |모델, obj|
    로거.정보("MONGOID :#{모델}에 검색 인덱스 생성중 ...")
    obj[모델] = 모델.create_search_indexes
  end

  wait_for_search_indexes(index_names_by_model) 만약 wait
end

#remove_indexes(models = ::Mongoid.models) ⇒ Array<Class>

제공된 glob이 주어지면 각 모델에 대한 인덱스를 제거하면 클래스가 포함되지 않습니다.

예시:

모든 인덱스를 제거합니다.

Mongoid::Tasks::Database.remove_indexes

반환합니다:

  • (Array<Class>)

    인덱싱되지 않은 모델.



139
140
141
142
143
144
145
146
147
148
149
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 139

def remove_indexes(모델 = ::몽고이드.모델)
  모델. do |모델|
    다음 만약 모델.임베디드?
    시작
      모델.remove_indexes
    구출 mongo::오류::OperationFailure
      다음
    end
    모델
  end.컴팩트
end

#remove_search_indexes(models = ::Mongoid.models) ⇒ 객체

지정된 모델에서 모든 검색 인덱스를 제거합니다.



155
156
157
158
159
160
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 155

def remove_search_indexes(모델 = ::몽고이드.모델)
  모델. do |모델|
    다음 만약 모델.임베디드?
    모델.remove_search_indexes
  end
end

#remove_undefined_indexes(models = ::Mongoid.models) ⇒ Hash{Class => Array(Hash)}

데이터베이스 에는 존재하지만 모델에는 지정되지 않은 인덱스를 제거합니다.

예시:

정의되지 않은 인덱스를 제거합니다.

Mongoid::Tasks::Database.remove_undefined_indexes

반환합니다:

  • (Hash{Class => Array(Hash)})

    모델별로 제거된 인덱스 목록입니다.



118
119
120
121
122
123
124
125
126
127
128
129
130
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 118

def remove_undefined_indexes(모델 = ::몽고이드.모델)
  undefined_indexes(모델). do |모델, 인덱스|
    인덱스. do |index|
       = index['key'].symbolize_keys
      컬렉션 = 모델.컬렉션
      컬렉션.인덱스(세션: 모델.send(:_session)).drop_one()
      로거.정보(
        "MONGOID: collection에서 '#{index['name']}'인덱스 제거" +
        "'#{컬렉션.name}'이(가) 데이터베이스 '#{컬렉션.데이터베이스.name}'에 있습니다."
      )
    end
  end
end

#shard_collections(models = ::Mongoid.models) ⇒ Array<Class>

샤드 키를 선언하는 모델을 위한 샤드 컬렉션입니다.

이 메서드가 호출되기 전에 컬렉션이 이미 샤딩된 된 모델 클래스를 포함하여 컬렉션이 샤딩된 된 모델 클래스를 반환합니다.

예시:

모든 컬렉션 샤딩

Mongoid::Tasks::Database.shard_collections

반환합니다:

  • (Array<Class>)

    샤드 모델



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 172

def shard_collections(모델 = ::몽고이드.모델)
  모델.map do |모델|
    다음 만약 모델.shard_config.nil?

    만약 모델.임베디드? && !모델.주기적?
      로거.경고("MONGOID: #{모델} 에 샤드 구성이 있지만 포함되어 있습니다. ")
      다음
    end

    하지 않는 한 모델.컬렉션.cluster.?
      로거.경고("MONGOID: #{모델} 에 샤드 구성이 있지만 샤드 샤딩된 클러스터 에 유지되지 않습니다: #{모델.컬렉션.클러스터.요약}")
      다음
    end

    # collStats를 실행하려면 컬렉션의 데이터베이스가 존재해야 합니다.
    # 서버 버전에 따라 컬렉션 자체도
    # 존재합니다.
    # MongoDB에는 데이터베이스를 생성하는 명령이 없습니다. 최고
    # 근사치는 우리가 원하는 컬렉션 을 생성하는 것입니다.
    # 이전 서버에서는 이미 존재하는 컬렉션을 생성하는 것이
    # 오류가 발생했습니다.
    # 또한 3.6 및 잠재적으로 오래된 서버는 다음을 제공하지 않습니다.
    # 존재하지 않는 데이터를 collStats하라는 메시지가 표시될 때의 오류 코드
    컬렉션 (https://jira.mongodb.org/browse/SERVER-50070).
    시작
      stats = 모델.컬렉션.database.명령(collStats: 모델.컬렉션.이름).first
    구출 mongo::오류::OperationFailure => exc
      # 코드 26 은(는) 데이터베이스 가 존재하지 않습니다.
      # 코드 8 은(는) 4.0 기준으로 컬렉션이 존재하지 않습니다.
      # 3.6 이전 버전에서는 예외 메시지의 텍스트가 일치합니다.
      만약 exc.코드 == 26 || exc.코드 == 8 ||
        exc.코드.nil? && exc.메시지 =~ /찾을 수 없음/
      then
        모델.컬렉션.create

        stats = 모델.컬렉션.database.명령(collStats: 모델.컬렉션.이름).first
      other
        올리다
      end
    end

    stats = 모델.컬렉션.database.명령(collStats: 모델.컬렉션.이름).first
    만약 stats[:sharded]
      로거.정보("MONGOID: #{모델.컬렉션.네임스페이스} 가 샤딩된 #{모델}에 대해 샤딩되었습니다.)
      다음 모델
    end

    admin_db = 모델.컬렉션.고객.메서드를(: admin).database

    시작
      admin_db.명령(enableSharding: 모델.컬렉션.database.이름)
    구출 mongo::오류::OperationFailure => exc
      # 샤딩이 이미 활성화된 경우 MongoDB Server 2.6 이(가) 실패합니다.
      만약 exc.코드 == 23 || exc.코드.nil? && exc.메시지 =~ /이미 활성화되어 있음/
        # 없음
      other
        올리다
      end
    end

    시작
      admin_db.명령(shardCollection: 모델.컬렉션.namespace, **모델.shard_config)
    구출 mongo::오류::OperationFailure => e
      로거.오류("  컬렉션 : #{ 모델}대한 컬렉션#{모델.컬렉션.네임스페이스}를 샤딩 하지 못했습니다.)
      다음
    end

    로거.정보("MONGOID: 샤드 컬렉션 #{모델.컬렉션.네임스페이스} for #{모델}")

    모델
  end.컴팩트
end

#undefined_indexes(models = ::Mongoid.models) ⇒ Array<Hash>

데이터베이스 에는 존재하지만 모델에 지정되지 않은 모델별 인덱스 목록을 반환합니다.

예시:

사용하지 않는 인덱스 목록을 반환합니다.

Mongoid::Tasks::Database.undefined_indexes

반환합니다:

  • (Array<Hash>)

    모델별 정의되지 않은 인덱스 목록입니다.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# 파일 'lib/mongoid/tasks/ 데이터베이스.rb', 줄 86

def undefined_indexes(모델 = ::몽고이드.모델)
  undefined_by_model = {}

  모델. do |모델|
    하지 않는 한 모델.임베디드?
      시작
        모델.컬렉션.인덱스(세션: 모델.send(:_session)). do |index|
          # ignore default index
          하지 않는 한 index['name'] == '_id_'
             = index['key'].symbolize_keys
            사양 = 모델.index_specation(, index['name'])
            하지 않는 한 사양
              # 인덱스가 지정되지 않았습니다.
              undefined_by_model[모델] ||= []
              undefined_by_model[모델] << index
            end
          end
        end
      구출 mongo::오류::OperationFailure; end
    end
  end

  undefined_by_model
end