클래스: Mongo::커서 비공개

상속:
객체
  • 객체
모두 표시
확장자:
전달 가능
다음을 포함합니다.
열거 가능, 재시도 가능
다음에 정의됨:
lib/mongo/cursor.rb,
lib/mongo/cursor/kill_spec.rb,
lib/mongo/cursor/nontailable.rb
more...

개요

이 클래스는 비공개 API의 일부입니다. 이 클래스는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

서버 의 쿼리 결과 설정하다 에 대한 반복자의 클라이언트 사이드 표현입니다.

Cursor 객체는 애플리케이션 코드에 직접 노출되지 않습니다. 오히려 Collection::ViewEnumerable 인터페이스를 애플리케이션에 노출하고 열거자는 Cursor 인스턴스의 지원을 받습니다.

예시:

이름이 Emily인 5 사용자 배열 을 가져옵니다.

users.find({:name => 'Emily'}).limit(5).to_a

각 사용자 문서에서 차단을 호출합니다.

users.find.each { |doc| puts doc }

직접 알려진 하위 클래스

캐싱 커서

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

모듈: NonTailable 클래스: killSpec

인스턴스 속성 요약 접기

클래스 메서드 요약 접기

인스턴스 메서드 요약 접기

Retryable에 포함된 메서드

#read_Worker, #select_server, #write_Worker

생성자 세부 정보

#initialize(보기, 결과, 서버, 옵션 = {}) ⇒ 커서

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

Cursor 객체를 생성합니다.

예시:

커서를 인스턴스화합니다.

Mongo::Cursor.new(view, response, server)

매개변수:

  • 보기 (CollectionView)

    쿼리를 정의하는 CollectionView 입니다.

  • 결과 (Operation::Result)

    첫 번째 실행의 결과입니다.

  • 서버 (MongoDB 서버)

    이 커서 가 잠겨 있는 서버 입니다.

  • 옵션 (해시) (기본값: {})

    커서 옵션.

옵션 해시(options):

  • :context (Operation::Context)

    이 커서 의 작업 컨텍스트입니다.

  • :disable_retry (true, false)

    getMore 작업을 보낼 때 오류 발생 시 재시도를 비활성화할지 여부(사용 중단됨, getMore 작업은 더 이상 재시도되지 않음)

  • :retry_reads (true, false)

    읽기 재시도(최신 메커니즘에 따라), 기본값은 true입니다.

이후:

  • 2.0.0

[소스 보기]

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 파일 'lib/ Mongo/ 커서.rb', 74줄

def 초기화(보기, 결과, 서버, 옵션 = {})
  하지 않는 한 결과.is_a?(작업::결과)
    올리다 ArgumentError, "두 번째 인수는 다음과 같아야 합니다. Mongo::Operation::Result: #{결과.검사}"
  end

  @view = 보기
  @server = 서버
  @initial_result = 결과
  @namespace = 결과.namespace
  @remaining = limit 만약 제한된?
  set_cursor_id(결과)
  만약 @cursor_id.nil?
    올리다 ArgumentError, '결과에 커서 ID가 있어야 합니다.'
  end
  @options = 옵션
  @session = @options[:session]
  @connection_global_id = 결과.connection_global_id
  @context = @options[:context]&.(connection_global_id: connection_global_id_for_context) || fresh_context
  @explicitly_closed = 거짓
  @ 락 = 뮤텍스.신규
  만약 서버.load_balancer?
    # 로드 밸런싱된 토폴로지 에서만 커서 연결이 필요합니다.
    # 그렇지 않으면 추가 참조가 필요하지 않습니다.
    @connection = @initial_result.연결
  end
  만약 닫힘?
    check_in_connection
  other
    등록
    ObjectSpace.describe_finalizer(
      self,
      self.클래스.마무리(kill_spec(@connection_global_id), cluster)
    )
  end
end

인스턴스 속성 세부 정보

#연결 객체(읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.


117
118
119
# 파일 'lib/ Mongo/ 커서.rb', 117줄

def 연결
  @connection
end

#contextOperation::Context (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이 커서 의 컨텍스트를 반환합니다.

반환합니다:


53
54
55
# 파일 'lib/ Mongo/ 커서.rb', 53줄

def 컨텍스트
  @context
end

#initial_result객체 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.


114
115
116
# 파일 'lib/ Mongo/ 커서.rb', 114줄

def initial_result
  @initial_result
end

#resume_tokenBSON::Document | nil (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

변경 스트림 재개를 위해 커서 로 추적한 재개 토큰

반환합니다:

  • (BSON::Document | nil)

    커서 재개 토큰입니다.


50
51
52
# 파일 'lib/ Mongo/ 커서.rb', 50줄

def resume_token
  @resume_token
end

#서버객체 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.


111
112
113
# 파일 'lib/ Mongo/ 커서.rb', 111줄

def 서버
  @server
end

#viewCollection::View (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

뷰를 반환합니다. 컬렉션 뷰를 반환합니다.

반환합니다:


44
45
46
# 파일 'lib/ Mongo/ 커서.rb', 44줄

def 보기
  @view
end

클래스 메서드 세부 정보

.finalize(kill_spec, cluster) ⇒ Proc

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

가비지 컬렉션을 위해 커서를 마무리합니다. 이 커서가 클러스터의 CursorReaper에 의해 실행되는 killCursors 작업에 포함되도록 예약합니다.

매개변수:

  • kill_spec (Cursor::KillSpec)

    KillCursor 작업 사양입니다.

  • cluster (Mongo::Cluster)

    이 커서 및 해당 서버와 연결된 클러스터입니다.

반환합니다:

  • (Proc)

    종료자.

[소스 보기]

128
129
130
131
132
133
134
135
# 파일 'lib/ Mongo/ 커서.rb', 128줄

def self.마무리(kill_spec, cluster)
  하지 않는 한 killSpec === kill_spec
    올리다 ArgumentError, "첫 번째 인수는 다음 과 같아야 합니다.
  end
  proc do
    cluster.Schedule_kill_cursor(kill_spec)
  end
end

인스턴스 메서드 세부 정보

#batch_size정수

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

배치 크기를 가져옵니다.

예시:

배치 크기를 가져옵니다.

cursor.batch_size

반환합니다:

  • (정수)

    배치 크기입니다.

이후:

  • 2.2.0

[소스 보기]

279
280
281
282
283
284
285
286
# 파일 'lib/ Mongo/ 커서.rb', 279줄

def batch_size
  value = @view.batch_size && @view.batch_size > 0 ? @view.batch_size : limit
  만약 value == 0
    nil
  other
    value
  end
end

#close(opts = {}) ⇒ nil

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이 커서 를 닫고 클라이언트 와 서버 의 관련 리소스를 모두 해제합니다.

반환합니다:

  • (nil)

    항상 nil입니다.

[소스 보기]

305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# 파일 'lib/ Mongo/ 커서.rb', 305줄

def 닫기(opts = {})
  반환 만약 닫힘?

  ctx = 컨텍스트 ? 컨텍스트.새로 고침(timeout_ms: opts[:timeout_ms]) : fresh_context(opts)

  등록 취소
  read_with_one_retry do
    사양 = {
      coll_name: collection_name,
      db_name: database.이름,
      cursor_ids: [id],
    }
    op = 작업::killCursors.신규(사양)
    execution_operation(op, 컨텍스트: ctx)
  end

  nil
구출 오류::OperationFailure::패밀리, 오류::SocketError, 오류::SocketTimeoutError, 오류::ServerNotUsable
  # 오류를 처리하면 알림이 표시되므로 오류를 처리합니다.
보장
  end_session
  @cursor_id = 0
  @ 락.동기화 do
    @explicitly_closed = true
  end
  check_in_connection
end

#닫았나요?true, false

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

커서가 닫혀 있습니까?

예시:

커서가 닫혀 있습니까?

cursor.closed?

반환합니다:

  • (true, false)

    커서가 닫힌 경우.

이후:

  • 2.2.0

[소스 보기]

296
297
298
299
# 파일 'lib/ Mongo/ 커서.rb', 296줄

def 닫힘?
  # @cursor_id는 원칙적으로 nil이 아니어야 합니다.
  @cursor_id.nil? || @cursor_id == 0
end

#collection_namestring

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

구문 분석된 컬렉션 이름을 가져옵니다.

예시:

구문 분석된 컬렉션 이름을 가져옵니다.

cursor.coll_name

반환합니다:

  • (string)

    컬렉션 이름입니다.

이후:

  • 2.2.0

[소스 보기]

341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# 파일 'lib/ Mongo/ 커서.rb', 341줄

def collection_name
  # 대부분의 경우 컬렉션 이름과 동일합니다.
  운전자 의 # 객체 입니다. 그러나 경우에 따라(예: 연결된
  # Atlas Data Lake), find 명령에 의해 반환된 네임스페이스
  # 다를 수 있으므로 컬렉션 이름 기반을 사용하고자 합니다.
  # 명령 결과의 네임스페이스에 추가됩니다.
  만약 @namespace
    # 네임스페이스 는 "데이터베이스. 컬렉션" 형식인 경우가 많습니다.
    # 그러나 컬렉션 이름에 마침표가 포함되는 경우도 있습니다.
    # 이것이 이 메서드가 첫 번째 네임스페이스 구성 요소 이후에 모든 네임스페이스 구성 요소를 조인하는 이유입니다.
    ns_components = @namespace.split('.')
    ns_components[1...ns_components.분량].가입('.')
  other
    컬렉션.이름
  end
end

#각각열거자

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

쿼리에서 반환된 문서를 반복합니다.

커서 는 최대 한 번만 반복될 수 있습니다. 불완전한 이터레이션도 허용됩니다. 커서 를 두 번 이상 반복하려고 하면 InvalidCursorOperation이 발생합니다.

예시:

커서에 있는 문서를 반복합니다.

cursor.each do |doc|
  ...
end

반환합니다:

  • (열거자)

    열거자입니다.

이후:

  • 2.0.0

[소스 보기]

163
164
165
166
167
168
169
170
171
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
# 파일 'lib/ Mongo/ 커서.rb', 163줄

def 

  # 첫 번째 배치를 이미 반복한 경우(예: get_more
  # 최소 한 번), 서버 측의 커서가 과거를 지난 경우
  # 첫 번째 배치를 만들고 다음을 수행하여 처음부터 반복을 다시 시작합니다.
  # 초기 결과를 반환하면 두 번째 배치 의 문서가 누락됩니다.
  # 이후 커서 가 있는 위치까지 일괄 처리됩니다. 이를 감지합니다.
  # 조건을 지정하고 반복을 중단합니다.
  #
  # 향후 운전자 버전에서는 각각 다음과 같이 계속됩니다.
  # 이전 반복의 끝 또는 항상 다음 위치에서 다시 시작
  # 시작.
  만약 @get_more_call
    올리다 오류::InvalidCursorOperation, 'getMore를 실행한 커서 의 반복을 다시 시작할 수 없습니다.'
  end

  #2.10 이전 버전과의 호환성을 유지하기 위해 드라이버 버전, 재설정
  # 새 반복이 시작될 때마다 문서가 배열 됩니다.
  @documents = nil

  만약 block_given?
    # try_next에 의해 발생한 StopIteration은 이 루프를 종료합니다.
    루프 do
      문서 = try_next
      만약 명시적으로_closed?
        올리다 오류::InvalidCursorOperation, '커서가 명시적으로 닫혔습니다. '
      end
      yield 문서 만약 문서
    end
    self
  other
    문서 = []
    # try_next에 의해 발생한 StopIteration은 이 루프를 종료합니다.
    루프 do
      문서 = try_next
      만약 명시적으로_closed?
        올리다 오류::InvalidCursorOperation, '커서가 명시적으로 닫혔습니다. '
      end
      문서 << 문서 만약 문서
    end
    문서
  end
end

#완전히 반복되었나요?부울

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

반환합니다:

  • (부울)
[소스 보기]

416
417
418
# 파일 'lib/ Mongo/ 커서.rb', 416줄

def 완전히 반복되나요?
  !!@fully_iterated
end

#get_moreArray<BSON::Document>

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

getMore 명령을 실행하고 서버 에서 가져온 문서 배치 를 반환합니다.

반환합니다:

  • (Array<BSON::Document>)

    문서 배치

[소스 보기]

391
392
393
394
395
396
397
398
399
400
# 파일 'lib/ Mongo/ 커서.rb', 391줄

def get_more
  @get_more_call = true

  # 최신 재시도 가능 읽기 사양은 getMores 재시도를 금지합니다.
  # getMores를 재시도하는 데 레거시 재시도 가능 읽기 로직이 사용되었지만, 이후
  # 이렇게 하면 조용히 데이터 손실이 발생할 수 있으며, 운전자 는 더 이상 재시도하지 않습니다.
  어떤 상황에서도 # getMore 작업을 수행할 수 있습니다.
  # https://github.com/mongodb/specifications/blob/master/source/retryable-reads/retryable-reads.md#qa
  프로세스(execution_operation(get_more_operation))
end

#idInteger

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

참고:

커서 ID가 0 이면 서버 에서 커서 가 닫혔음을 의미합니다.

커서 ID를 가져옵니다.

예시:

커서 ID를 가져옵니다.

cursor.id

반환합니다:

  • (정수)

    커서 ID입니다.

이후:

  • 2.2.0

[소스 보기]

368
369
370
# 파일 'lib/ Mongo/ 커서.rb', 368줄

def id
  @cursor_id
end

#검사string

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

사람이 읽을 수 있는 Cursor의 string 표현을 가져옵니다.

예시:

커서를 검사합니다.

cursor.inspect

반환합니다:

  • (string)

    Cursor 인스턴스의 string 표현입니다.

이후:

  • 2.0.0

[소스 보기]

145
146
147
# 파일 'lib/ Mongo/ 커서.rb', 145줄

def 검사
  "#<Mongo::Cursor:0x#{object_id} @view=#{@view.검사}>"
end

#kill_spec(connection_global_id) ⇒ 객체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

[소스 보기]

403
404
405
406
407
408
409
410
411
412
413
# 파일 'lib/ Mongo/ 커서.rb', 403줄

def kill_spec(connection_global_id)
  killSpec.신규(
    cursor_id: id,
    coll_name: collection_name,
    db_name: database.이름,
    connection_global_id: connection_global_id,
    server_address: 서버.주소,
    세션: @session,
    연결: @connection
  )
end

#to_returnInteger

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

반환할 문서 수를 가져옵니다. 3.0 이하의 서버 버전에서 사용됩니다.

예시:

반환할 번호를 가져옵니다.

cursor.to_return

반환합니다:

  • (정수)

    반환할 문서 수입니다.

이후:

  • 2.2.0

[소스 보기]

381
382
383
# 파일 'lib/ Mongo/ 커서.rb', 381줄

def to_return
  use_limit? ? @remaining : (batch_size || 0)
end

#try_nextBSON::Document | nil

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

참고:

이 방법은 실험적이며 변경될 수 있습니다.

사용 가능한 경우 쿼리 에서 하나의 문서 를 반환합니다.

이 메서드는 서버 의 변경 사항을 최대 max_await_time_ms 밀리초 동안 기다리며, 변경 사항이 수신되지 않으면 nil을 반환합니다. 서버 에서 반환할 문서가 더 이상 없거나 커서 를 모두 사용한 경우 StopIteration 예외가 발생합니다.

반환합니다:

  • (BSON::Document | nil)

    문서 입니다.

다음을 발생시킵니다.

  • (StopIteration)

    커서 가 완전히 반복된 후 호출에서 발생합니다.

[소스 보기]

223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# 파일 'lib/ Mongo/ 커서.rb', 223줄

def try_next
  만약 @documents.nil?
    # Mongoid의 게시된 버전에는 이전 운전자 커서 의 복사본이 있으므로
    # 코드에서 프로세스 의 중복 호출은 Mongoid 쿼리 가 실행될 때 # 호출되지 않습니다.
    캐시 #개가 활성화되어 있습니다. 여기에서 dup을 호출하여 이 문제를 해결하세요.
    # Mongoid의 코드에서 나올 수 있는 # 프로세스 의 결과입니다.
    @documents = 프로세스(@initial_result).dup
    # 여기에 있는 문서는 빈 배열일 수 있으므로
    # 첫 번째 try_next 호출에서 getMore를 발행하게 될 수 있습니다.
  end

  만약 @documents.비어 있나요?
    # 빈 배치에서는 배치 재개 토큰을 캐시 합니다.
    cache_batch_resume_token

    하지 않는 한 닫힘?
      만약 지쳐?
        닫기
        @fully_iterated = true
        올리다 StopIteration
      end
      @documents = get_more
    other
      @fully_iterated = true
      올리다 StopIteration
    end
  other
    # 커서가 여기에 닫힙니다.
    # 문서를 빈 배열 로 유지
  end

  # 문서가 하나 이상 있는 경우 해당 문서 의 _id 를 캐시 합니다.
  만약 @documents[0]
    cache_resume_token(@documents[0])
  end

  # 반복하는 경우 배치 재개 토큰을 캐시합니다.
  # 마지막 문서 위에 덮어쓰거나 배치가 비어 있는 경우
  만약 @documents.size <= 1
    cache_batch_resume_token
    만약 닫힘?
      @fully_iterated = true
    end
  end

  반환 @documents.shift
end