클래스: Mongo::커서 비공개
- 상속:
-
객체
- 객체
- Mongo::커서
- 확장자:
- 전달 가능
- 다음을 포함합니다.
- 열거 가능, 재시도 가능
- 다음에 정의됨:
- lib/mongo/cursor.rb,
lib/mongo/cursor/kill_spec.rb,
lib/mongo/cursor/nontailable.rb
개요
이 클래스는 비공개 API의 일부입니다. 이 클래스는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
서버 의 쿼리 결과 설정하다 에 대한 반복자의 클라이언트 사이드 표현입니다.
Cursor 객체는 애플리케이션 코드에 직접 노출되지 않습니다. 오히려 Collection::View 은 Enumerable 인터페이스를 애플리케이션에 노출하고 열거자는 Cursor 인스턴스의 지원을 받습니다.
직접 알려진 하위 클래스
네임스페이스 아래에 정의됨
모듈: NonTailable 클래스: killSpec
인스턴스 속성 요약 접기
- #연결 ⇒ 객체 읽기 전용 비공개
-
#context ⇒ Operation::Context
읽기 전용
비공개
이 커서 의 컨텍스트를 지정합니다.
- #initial_result ⇒ 객체 읽기 전용 비공개
-
#resume_token ⇒ BSON::Document | nil
읽기 전용
비공개
변경 스트림 재개를 위해 커서로 추적한 재개 토큰입니다.
- #서버 ⇒ 객체 읽기 전용 비공개
-
#view ⇒ Collection::View
읽기 전용
비공개
보기 컬렉션 보기.
클래스 메서드 요약 접기
-
.finalize(kill_spec, cluster) ⇒ Proc
비공개
가비지 컬렉션 을 위한 커서 를 마무리합니다.
인스턴스 메서드 요약 접기
-
#batch_size ⇒ 정수
비공개
배치 크기를 가져옵니다.
-
#close(opts = {}) ⇒ nil
비공개
이 커서 를 닫고 클라이언트 와 서버 의 관련 리소스를 모두 해제합니다.
-
#닫았나요? ⇒ 참, 거짓
비공개
커서가 닫혀 있습니까?
-
#collection_name ⇒ string
비공개
구문 분석된 컬렉션 이름을 가져옵니다.
-
#각각 ⇒ 열거자
비공개
쿼리에서 반환된 문서를 반복합니다.
- #완전히 반복되었나요? ⇒ 부울 비공개
-
#get_more ⇒ Array<BSON::Document>
비공개
getMore 명령을 실행하고 서버 에서 가져온 문서 배치 를 반환합니다.
-
#ID ⇒ 정수
비공개
커서 ID를 가져옵니다.
-
#initialize(view, 결과, 서버, options = {}) ⇒ 커서
생성자
비공개
Cursor객체를 생성합니다. -
#검사 ⇒ string
비공개
사람이 읽을 수 있는
Cursor의 string 표현을 가져옵니다. - #kill_spec(connection_global_id) ⇒ 객체 비공개
-
#refresh_timeout! ⇒ 객체
비공개
다음 getMore가 새로운 시간 초과 기한으로 시작되도록 커서의 CSOT 컨텍스트를 새로 고칩니다.
-
#try_next ⇒ BSON::Document | nil
비공개
사용 가능한 경우 쿼리 에서 하나의 문서 를 반환합니다.
Retryable에 포함된 메서드
#read_Worker, #select_server, #with_overload_retry, #write_Worker
생성자 세부 정보
#initialize(보기, 결과, 서버, 옵션 = {}) ⇒ 커서
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
Cursor 객체를 생성합니다.
72 73 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 |
# 파일 'lib/ Mongo/ 커서.rb', 72줄 def 초기화(보기, 결과, 서버, = {}) 하지 않는 한 결과.is_a?(작업::결과) 올리다 ArgumentError, "두 번째 인수는 다음과 같아야 합니다. Mongo::Operation::Result: #{결과.검사}" end @view = 보기 @server = 서버 @initial_result = 결과 @namespace = 결과.namespace @remaining = limit 만약 제한된? set_cursor_id(결과) 올리다 ArgumentError, '결과에 커서 ID가 있어야 합니다.' 만약 @cursor_id.nil? @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 = 거짓 @get_more_network_error = 거짓 @ 락 = 뮤텍스.신규 만약 서버.load_balancer? # 로드 밸런싱된 토폴로지 에서만 커서 연결이 필요합니다. # 그렇지 않으면 추가 참조가 필요하지 않습니다. @connection = @initial_result.연결 end 만약 닫힘? check_in_connection other 등록 ObjectSpace.describe_finalizer( self, self.클래스.마무리(kill_spec(@connection_global_id), cluster) ) end end |
인스턴스 속성 세부 정보
#연결 ⇒ 객체(읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
115 116 117 |
# 파일 'lib/ Mongo/ 커서.rb', 115줄 def 연결 @connection end |
#context ⇒ Operation::Context (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 커서 의 컨텍스트를 반환합니다.
51 52 53 |
# 파일 'lib/ Mongo/ 커서.rb', 51줄 def 컨텍스트 @context end |
#initial_result ⇒ 객체 (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
112 113 114 |
# 파일 'lib/ Mongo/ 커서.rb', 112줄 def initial_result @initial_result end |
#resume_token ⇒ BSON::Document | nil (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
변경 스트림 재개를 위해 커서 로 추적한 재개 토큰
48 49 50 |
# 파일 'lib/ Mongo/ 커서.rb', 48줄 def resume_token @resume_token end |
#서버 ⇒ 객체 (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
109 110 111 |
# 파일 'lib/ Mongo/ 커서.rb', 109줄 def 서버 @server end |
#view ⇒ Collection::View (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
뷰를 반환합니다. 컬렉션 뷰를 반환합니다.
42 43 44 |
# 파일 'lib/ Mongo/ 커서.rb', 42줄 def 보기 @view end |
클래스 메서드 세부 정보
.finalize(kill_spec, cluster) ⇒ Proc
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
가비지 컬렉션 위한 커서 마무리합니다. 이 커서 클러스터의 CursorReaper에 의해 실행되는 killCursors 작업에 포함되도록 예약합니다.
126 127 128 129 130 131 132 |
# 파일 'lib/ Mongo/ 커서.rb', 126줄 def self.마무리(kill_spec, cluster) 올리다 ArgumentError, "첫 번째 인수는 다음 과 같아야 합니다. 하지 않는 한 kill_spec.is_a?(killSpec) proc do cluster.Schedule_kill_cursor(kill_spec) end end |
인스턴스 메서드 세부 정보
#batch_size ⇒ 정수
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
배치 크기를 가져옵니다.
269 270 271 272 273 274 275 276 |
# 파일 'lib/ Mongo/ 커서.rb', 269줄 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의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 커서 를 닫고 클라이언트 와 서버 의 관련 리소스를 모두 해제합니다.
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
# 파일 'lib/ Mongo/ 커서.rb', 295줄 def 닫기(opts = {}) 반환 만약 닫힘? ctx = 컨텍스트 ? 컨텍스트.새로 고침(timeout_ms: opts[:timeout_ms]) : fresh_context(opts) 등록 취소 하지 않는 한 @get_more_network_error read_with_one_retry do 사양 = { coll_name: collection_name, db_name: database.이름, cursor_ids: [ id ], } op = 작업::killCursors.신규(사양) execution_operation(op, 컨텍스트: ctx) end end nil 구출 오류::OperationFailure::패밀리, 오류::SocketError, 오류::SocketTimeoutError, 오류::ServerNotUsable, 오류::ConnectionPerished # 오류를 처리하여 수행할 수 있는 작업이 없으므로 오류를 삼킵니다. 보장 end_session @cursor_id = 0 @ 락.동기화 do @explicitly_closed = true end check_in_connection end |
#닫았나요? ⇒ true, false
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
커서가 닫혀 있습니까?
286 287 288 289 |
# 파일 'lib/ Mongo/ 커서.rb', 286줄 def 닫힘? # @cursor_id는 원칙적으로 nil이 아니어야 합니다. @cursor_id.nil? || @cursor_id == 0 end |
#collection_name ⇒ string
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
구문 분석된 컬렉션 이름을 가져옵니다.
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 |
# 파일 'lib/ Mongo/ 커서.rb', 333줄 def collection_name # 대부분의 경우 컬렉션 이름과 동일합니다. 운전자 의 # 객체 입니다. 그러나 경우에 따라(예: 연결된 # Atlas Data Lake), find 명령에 의해 반환된 네임스페이스 # 다를 수 있으므로 컬렉션 이름 기반을 사용하고자 합니다. # 명령 결과의 네임스페이스에 추가됩니다. 만약 @namespace # 네임스페이스 는 "데이터베이스. 컬렉션" 형식인 경우가 많습니다. # 그러나 컬렉션 이름에 마침표가 포함되는 경우도 있습니다. # 이것이 이 메서드가 첫 번째 네임스페이스 구성 요소 이후에 모든 네임스페이스 구성 요소를 조인하는 이유입니다. ns_components = @namespace.split('.') ns_components[1...ns_components.분량].가입('.') other 컬렉션.이름 end end |
#각각 ⇒ 열거자
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
쿼리에서 반환된 문서를 반복합니다.
커서 는 최대 한 번만 반복될 수 있습니다. 불완전한 이터레이션도 허용됩니다. 커서 를 두 번 이상 반복하려고 하면 InvalidCursorOperation이 발생합니다.
160 161 162 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 |
# 파일 'lib/ Mongo/ 커서.rb', 160줄 def 각 # 첫 번째 배치를 이미 반복한 경우(예: get_more # 최소 한 번), 서버 측의 커서가 과거를 지난 경우 # 첫 번째 배치를 만들고 다음을 수행하여 처음부터 반복을 다시 시작합니다. # 초기 결과를 반환하면 두 번째 배치 의 문서가 누락됩니다. # 이후 커서 가 있는 위치까지 일괄 처리됩니다. 이를 감지합니다. # 조건을 지정하고 반복을 중단합니다. # # 향후 운전자 버전에서는 각각 다음과 같이 계속됩니다. # 이전 반복의 끝 또는 항상 다음 위치에서 다시 시작 # 시작. 만약 @get_more_call 올리다 오류::InvalidCursorOperation, 'getMore를 실행한 커서 의 반복을 다시 시작할 수 없습니다.' end #2.10 이전 버전과의 호환성을 유지하기 위해 드라이버 버전, 재설정 # 새 반복이 시작될 때마다 문서가 배열 됩니다. @documents = nil 만약 block_given? # try_next에 의해 발생한 StopIteration은 이 루프를 종료합니다. 루프 do 문서 = try_next 올리다 오류::InvalidCursorOperation, '커서가 명시적으로 닫혔습니다. ' 만약 명시적으로_closed? yield 문서 만약 문서 end self other 문서 = [] # try_next에 의해 발생한 StopIteration은 이 루프를 종료합니다. 루프 do 문서 = try_next 올리다 오류::InvalidCursorOperation, '커서가 명시적으로 닫혔습니다. ' 만약 명시적으로_closed? 문서 << 문서 만약 문서 end 문서 end end |
#완전히 반복되었나요? ⇒ 부울
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
409 410 411 |
# 파일 'lib/ Mongo/ 커서.rb', 409줄 def 완전히 반복되나요? !!@fully_iterated end |
#get_more ⇒ Array<BSON::Document>
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
getMore 명령을 실행하고 서버 에서 가져온 문서 배치 를 반환합니다.
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 |
# 파일 'lib/ Mongo/ 커서.rb', 370줄 def get_more @get_more_call = true # 최신 재시도 가능 읽기 사양은 getMores 재시도를 금지합니다. # getMores를 재시도하는 데 레거시 재시도 가능 읽기 로직이 사용되었지만, 이후 # 이렇게 하면 조용히 데이터 손실이 발생할 수 있으며, 운전자 는 더 이상 재시도하지 않습니다. 어떤 상황에서도 # getMore 작업을 수행할 수 있습니다. # https://github.com/mongodb/specifications/blob/master/source/retryable-reads/retryable-reads.md#qa # # 그러나 오버로드 오류(SystemOverloadedError + RetryableError)는 # 서버 처리한 적이 없으므로 지수 백오프로 재시도 # 요청. with_overload_retry(컨텍스트: 아마도_새로고침_컨텍스트) do 프로세스(execution_operation(get_more_operation)) end 구출 오류::SocketError, 오류::SocketTimeoutError @get_more_network_error = true 올리다 구출 오류::OperationFailure => e # getMore에 대한 오버로드 재시도가 소진되면 커서 닫습니다. # killCursors가 서버 로 전송되도록 합니다. 닫기 만약 e.레이블?('RetryableError') && e.레이블?('SystemOverloadedError') 올리다 end |
#id ⇒ Integer
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
커서 ID가 0 이면 서버 에서 커서 가 닫혔음을 의미합니다.
커서 ID를 가져옵니다.
360 361 362 |
# 파일 'lib/ Mongo/ 커서.rb', 360줄 def id @cursor_id end |
#검사 ⇒ string
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
사람이 읽을 수 있는 Cursor의 string 표현을 가져옵니다.
142 143 144 |
# 파일 'lib/ Mongo/ 커서.rb', 142줄 def 검사 "#<Mongo::Cursor:0x#{object_id} @view=#{@view.검사}>" end |
#kill_spec(connection_global_id) ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
396 397 398 399 400 401 402 403 404 405 406 |
# 파일 'lib/ Mongo/ 커서.rb', 396줄 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 |
#refresh_timeout! ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
다음 getMore가 새로운 시간 초과 기한으로 시작되도록 커서의 CSOT 컨텍스트를 새로 고칩니다. 테일 커서(tailable awaitData cursor)에서 CSOT 사양에서 요구하는 대로 반복별 시간 초과 새로 고침을 구현 데 사용됩니다. 활성 시간 초과가 있는 테일 커서(tailable waitData 커서) 인 경우에만 새로 고침됩니다.
419 420 421 422 423 |
# 파일 'lib/ Mongo/ 커서.rb', 419줄 def refresh_timeout! 반환 하지 않는 한 보기.cursor_type == :tailable_await && 컨텍스트.시간 초과? @context = @context.새로 고침(보기: 보기) end |
#try_next ⇒ BSON::Document | nil
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 방법은 실험적이며 변경될 수 있습니다.
사용 가능한 경우 쿼리 에서 하나의 문서 를 반환합니다.
이 메서드는 서버 의 변경 사항을 최대 max_await_time_ms 밀리초 동안 기다리며, 변경 사항이 수신되지 않으면 nil을 반환합니다. 서버 에서 반환할 문서가 더 이상 없거나 커서 를 모두 사용한 경우 StopIteration 예외가 발생합니다.
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 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# 파일 'lib/ Mongo/ 커서.rb', 217줄 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 other 만약 지쳐? 닫기 @fully_iterated = true 올리다 StopIteration end @documents = get_more end other # 커서가 여기에 닫힙니다. # 문서를 빈 배열 로 유지 end # 문서가 하나 이상 있는 경우 해당 문서 의 _id 를 캐시 합니다. cache_resume_token(@documents[0]) 만약 @documents[0] # 반복하는 경우 배치 재개 토큰을 캐시합니다. # 마지막 문서 위에 덮어쓰거나 배치가 비어 있는 경우 만약 @documents.size <= 1 cache_batch_resume_token @fully_iterated = true 만약 닫힘? end @documents.shift end |