Classe: Mongo::Cursor Private
- Herda:
-
Objeto
- Objeto
- Mongo::Cursor
- Estendido por:
- Encaminhável
- Inclui:
- Enumerável , repetível
- Definido em:
- lib/mongo/cursor.rb,
lib/mongo/cursor/kill_spec.rb,
lib/mongo/cursor/nontailable.rb
Visão geral
Esta classe faz parte de uma API privada. Evite usar essa classe, se possível, pois ela pode ser removida ou alterada no futuro.
Representação do lado do cliente de um iterador sobre um conjunto de resultados de query no servidor.
Cursor objetos não estão diretamente expostos ao código do aplicativo. Em vez disso, Collection::View expõe a interface Enumerable aos aplicativos, e o enumerador é apoiado por uma instância Cursor .
Subclasses conhecidas diretas
Definido sob namespace
Módulos: Não rastreável Classes: KillSpec
Recolhimento do Resumo do atributo de instância
- #connection ➤ Objeto Somente leitura privado
-
#context ➤ Operação::Context
Somente leitura
privado
Contexto o contexto deste cursor.
- #initial_result ➤ Objeto Somente leitura privado
-
#resume_token ➤ BSON::Document | nada
Somente leitura
privado
O token de retomada rastreado pelo cursor para a retomada do change stream.
- #servidor ➤ Objeto Somente leitura privado
-
#view ➤ Collection::View
Somente leitura
privado
Visualizar A visualização da collection.
Recolhimento do Resumo do método de classe
-
.finalizar(kill_spec, cluster) ➤ Proc
privado
Finalize o cursor para a coleta de lixo.
Recolhimento do Resumo do método de instância
-
#batch_size ➤ Inteiro
privado
Obtenha o tamanho do lote .
-
#close(opts = {}) ➤ nil
privado
Fecha este cursor, liberando quaisquer recursos associados no cliente e no servidor.
-
#fechado? ➤ verdadeiro, falso
privado
O cursor está fechado?
-
#collection_name ➤ string
privado
Obtém o nome da coleção analisada.
-
#cada ➤ Enumerador
privado
Iterar através dos documentos retornados da query.
- #full_iterated? ➤ Booleano privado
-
#get_more ➤ Array<BSON::Document>
privado
Execute um comando getMore e retorne o lote de documentos obtidos do servidor.
-
#ID ➤ Inteiro
privado
Obtenha o ID do cursor.
-
#inicializar(visualização, resultado, servidor, opções = {}) ➤ Cursor
construtor
privado
Cria um objeto
Cursor. -
#inspecionar ➤ string
privado
Obtenha uma representação de string legível por humanos de
Cursor. - #kill_spec(connection_global_id) ➤ Objeto privado
-
#refresh_timeout! ➤ Objeto
privado
Atualiza o contexto CSOT do cursor para que o próximo getMore comece com um novo prazo de tempo limite.
-
#try_next ⇒ BSON::Document | nil
privado
Retorne um documento da query, se houver um disponível.
Métodos incluídos no Retryable
#read_worker, #select_server, #with_overload_retry, #write_worker
Detalhes do construtor
#inicializar(visualização, resultado, servidor, opções = {}) ➤ Cursor
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Cria um objeto 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 |
# Arquivo 'lib/mongo/cursor.rb', linha 72 def inicializar(vista, Resultado, Servidor, = {}) a menos que Resultado.is_a?((operação)::Resultado) aumentar ArgumentError, "O segundo argumento deve ser um Mongo::Operation::Result: #{result.inspect}" end @view = vista @server = Servidor @initial_result = Resultado @namespace = Resultado.namespace @remaining = limit se limitado? set_cursor_id(Resultado) aumentar ArgumentError, ' OID do cursor deve estar presente no resultado' se @cursor_id.nada? @opções = @session = @opções[:session] @connection_global_id = Resultado.connection_global_id @context = @opções[:context]&.com(connection_global_id: connection_global_id_for_context) || refresh_context @explicitly_closed = false @get_more_network_error = false @ bloqueio = Mutex.Novo se Servidor.load_balancer? # Precisamos da conexão no cursor somente em topologia balanceada de carga; # não precisamos de uma referência adicional a ele de outra forma. @connection = @initial_result.Conexão end se fechado? check_in_connection mais register ObjectSpace.define_finalizer( auto, auto.classe.finalizar(kill_spec(@connection_global_id), cluster) ) end end |
Detalhes do atributo da instância
#connection ➤ Object (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
115 116 117 |
# Arquivo 'lib/mongo/cursor.rb', linha 115 def Conexão @connection end |
#context ➤ Operação::Context (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna o contexto deste cursor.
51 52 53 |
# Arquivo 'lib/mongo/cursor.rb', linha 51 def Contexto @context end |
#initial_result ➤ Objeto (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
112 113 114 |
# Arquivo 'lib/mongo/cursor.rb', linha 112 def initial_result @initial_result end |
#resume_token ➤ BSON::Document | nil (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
O token de retomada rastreado pelo cursor para a retomada do fluxo de alterações
48 49 50 |
# Arquivo 'lib/mongo/cursor.rb', linha 48 def resume_token @resume_token end |
#server ➤ Object (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
109 110 111 |
# Arquivo 'lib/mongo/cursor.rb', linha 109 def Servidor @server end |
#view ➤ Collection::View (readonly)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna a visualização A visualização da collection.
42 43 44 |
# Arquivo 'lib/mongo/cursor.rb', linha 42 def vista @view end |
Detalhes do método de classe
.finalizar(kill_spec, cluster) ➤ Proc
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Finalize o cursor para a coleção de lixo. Agenda este cursor para ser incluído em uma operação killCursors executada pelo CursorReaper do Cluster.
126 127 128 129 130 131 132 |
# Arquivo 'lib/mongo/cursor.rb', linha 126 def auto.finalizar(kill_spec, cluster) aumentar ArgumentError, "O primeiro argumento deve ser um KillSpec: #{kill_spec.inspect}" a menos que kill_spec.is_a?(KillSpec) proc fazer cluster.agendamento_kill_cursor(kill_spec) end end |
Detalhes do método de instância
#batch_size ➤ Inteiro
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Obtenha o tamanho do lote .
269 270 271 272 273 274 275 276 |
# Arquivo 'lib/mongo/cursor.rb', linha 269 def batch_size valor = (@view.batch_size && @view.batch_size > 0) ? @view.batch_size : limit se valor == 0 nada mais valor end end |
#close(opts = {}) ➤ nil
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Fecha este cursor, liberando quaisquer recursos associados no cliente e no servidor.
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 |
# Arquivo 'lib/mongo/cursor.rb', linha 295 def Fechar(opciona = {}) Método se fechado? ctx = Contexto ? Contexto.atualizar(timeout_ms: opciona[:timeout_ms]) : refresh_context(opciona) cancelar registro a menos que @get_more_network_error read_with_one_retry fazer especificações = { coll_name: collection_name, db_name: database.name, cursor_ids: [ id ], } op = (operação)::matarCursores.Novo(especificações) execute_operation(op, contexto: ctx) end end nada salvar Erro::Falha de operação::família, Erro::Erro de soquete, Erro::SocketTimeoutError, Erro::ServerNotUsable, Erro::ConnectionPerished # Os erros são aceitos porque não há nada que possa ser feito ao gerenciá-los. garantir end_session @cursor_id = 0 @ bloqueio.sincronizar fazer @explicitly_closed = true end check_in_connection end |
#fechado? ➤ true, false
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
O cursor está fechado?
286 287 288 289 |
# Arquivo 'lib/mongo/cursor.rb', linha 286 def fechado? # @cursor_id deve, em princípio, nunca ser nulo @cursor_id.nada? || @cursor_id == 0 end |
#collection_name ➤ string
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Obtém o nome da coleção analisada.
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 |
# Arquivo 'lib/mongo/cursor.rb', linha 333 def collection_name # Na maioria dos casos, será equivalente ao nome da collection # objeto no driver. No entanto, em alguns casos (por exemplo, quando conectado # para um Atlas Data Lake), o namespace retornado pelo comando find # pode ser diferente, e é por isso que queremos usar o nome da coleção com base # no namespace no resultado do comando. se @namespace # Muitas vezes, o namespace estará no formato "banco de dados.collection". # No entanto, às vezes, o nome da coleção conterá pontos, o que # é por isso que esse método une todos os componentes do namespace após o primeiro. ns_components = @namespace.dividir('.') ns_components[1...ns_components.Tamanho].juntar('.') mais collection.name end end |
#cada ➤ Enumerador
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Iterar através dos documentos retornados da query.
Um cursor pode ser iterado no máximo uma vez. Iteração incompleta também é permitida. A tentativa de iterar o cursor mais de uma vez gera 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 |
# Arquivo 'lib/mongo/cursor.rb', linha 160 def cada # Se já iteramos além do primeiro lote (ou seja, chamado get_more # pelo menos uma vez), o cursor no lado do servidor avançou além # o primeiro lote e reiniciando a iteração desde o início por # retornar o resultado inicial perderia documentos no segundo lote # e lotes subsequentes até onde estiver o cursor. Detectar isso # condição e abortar a iteração. # # Em uma versão futura do driver, cada um continuaria do # fim da iteração anterior ou sempre reiniciaria a partir do # início. se @get_more_ call aumentar Erro::InvalidCursorOperation, 'Não é possível reiniciar a iteração de um cursor que emitiu um getMore' end # Para manter a compatibilidade com a pré-2.10 versões do driver, redefinir # a array de documentos cada vez que uma nova iteração é iniciada. @documents = nada se block_given? # A StopIteration gerada por try_next encerra este loop. loop fazer documento = try_next aumentar Erro::InvalidCursorOperation, ' Ocursor foi explicitamente fechado' se explicitamente_closed? rendimento documento se documento end auto mais documentos = [] # A StopIteration gerada por try_next encerra este loop. loop fazer documento = try_next aumentar Erro::InvalidCursorOperation, ' Ocursor foi explicitamente fechado' se explicitamente_closed? documentos << documento se documento end documentos end end |
#full_iterated? ➤ Booleano
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
409 410 411 |
# Arquivo 'lib/mongo/cursor.rb', linha 409 def full_iterated? !!@full_iterated end |
#get_more ➤ Array<BSON::Document>
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Execute um comando getMore e retorne o lote de documentos obtidos do servidor.
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 |
# Arquivo 'lib/mongo/cursor.rb', linha 370 def get_more @get_more_ call = true # A especificação moderna de leituras repetíveis proíbe a repetição de getMores. # A lógica legada de leitura repetível usada para tentar novamente getMores, mas desde # isso pode resultar em perda silenciosa de dados, o motorista não tenta mais # operações getMore em qualquer circunstância. # https://github.com/mongodb/specifications/blob/master/source/retryable-reads/retryable-reads.md#qa # # No entanto, erros de sobrecarga (SystemOverloadedError + RetryableError) são # tentou com backoff exponencial desde o servidor nunca processado # a solicitação. with_overload_retry(contexto: possivelmente_refreshed_context) fazer Processo(execute_operation(get_more_operation)) end salvar Erro::Erro de soquete, Erro::SocketTimeoutError @get_more_network_error = true aumentar salvar Erro::Falha de operação => e # Quando as tentativas de sobrecarga se esgotarem no getMore, feche o cursor # para que o killCursors seja enviado ao servidor. Fechar se e.rótulo?('RetryableError') && e.rótulo?('SystemOverloadedError') aumentar end |
#id ⇒ Integer
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Um ID de cursor de 0 significa que o cursor foi fechado no servidor.
Obtenha o ID do cursor.
360 361 362 |
# Arquivo 'lib/mongo/cursor.rb', linha 360 def id @cursor_id end |
#inspecionar ➤ string
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Obtenha uma representação de string legível por humanos de Cursor.
142 143 144 |
# Arquivo 'lib/mongo/cursor.rb', linha 142 def inspecionar "#<Mongo::Cursor:0x#{object_id} @view=#{@view.inspect}>" end |
#kill_spec(connection_global_id) ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
396 397 398 399 400 401 402 403 404 405 406 |
# Arquivo 'lib/mongo/cursor.rb', linha 396 def kill_spec(connection_global_id) KillSpec.Novo( cursor_id: id, coll_name: collection_name, db_name: database.name, connection_global_id: connection_global_id, server_address: Servidor.endereço, sessão: @session, conexão: @connection ) end |
#refresh_timeout! ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Atualiza o contexto CSOT do cursor para que o próximo getMore comece com um novo prazo de tempo limite. Usado por cursores tailable awaitData para implementar a atualização do tempo limite por iteração, conforme exigido pela especificação do CSOT. Só é atualizado se este for um cursor tailable awaitData com um tempo limite ativo.
419 420 421 422 423 |
# Arquivo 'lib/mongo/cursor.rb', linha 419 def refresh_timeout! Método a menos que vista.cursor_type == :tailable_await && Contexto.tempo-limite? @context = @context.atualizar(visualizar: vista) end |
#try_next ➤ BSON::Document | nada
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Este método é experimental e sujeito a alterações.
Retorne um documento da query, se houver um disponível.
Este método aguardará até max_await_time_ms milissegundos por alterações do servidor e, se nenhuma alteração for recebida, retornará nulo. Se não houver mais documentos para retornar do servidor, ou se tivermos esgotado o cursor, será gerada uma exceção de 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 |
# Arquivo 'lib/mongo/cursor.rb', linha 217 def try_next se @documents.nada? # Como as versões publicadas do Mongoid têm uma cópia do cursor do driver antigo # code, nossa chamada dup em #process não é invocada quando Mongoid query # cache está ativo. Contorne isso ligando para dup aqui em # o resultado de #process que pode sair do código do Mongoid. @documents = Processo(@initial_result).dup # os documentos aqui podem ser uma array vazia, portanto # podemos acabar emitindo um getMore na primeira chamada try_next end se @documents.vazio? # Em lotes vazios, armazenamos em cache o token de retomada do lote cache_batch_resume_token se fechado? @full_iterated = true aumentar StopIteration mais se esgotado? Fechar @full_iterated = true aumentar StopIteration end @documents = get_more end mais # cursor está fechado aqui # mantém documentos como um array vazio end # Se houver pelo menos um documento, armazene em cache seu _id cache_resume_token(@documents[0]) se @documents[0] # Armazene em cache o token de retomada do lote se estivermos iterando # sobre o último documento ou se o lote estiver vazio se @documents.Tamanho <= 1 cache_batch_resume_token @full_iterated = true se fechado? end @documents.mudança end |