类:Mongo::Cursor Private
- 继承:
-
对象
- 对象
- Mongo::Cursor
- 扩展方式:
- 可转发
- 包括:
- 可枚举、可重试
- 定义于:
- 构建/ruby-driver-v2.19/lib/ mongo / 游标.rb ,
构建/ruby-driver-v2.19/lib/ mongo / 游标/kill_spec.rb
Overview
此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。
针对服务器上查询结果设立的迭代器的客户端表示形式。
Cursor
对象不直接公开给应用程序代码。 相反, Collection::View
向应用程序公开Enumerable
接口,并且枚举器由Cursor
实例支持。
直接已知子类
在命名空间下定义
类: KillSpec
实例属性摘要折叠
- #initial_result ⇒ 对象 只读 private
-
#resume_token ⇒ BSON::Document | nil
只读
private
游标跟踪的恢复令牌,用于恢复变更流。
- # server ⇒ 对象 只读 private
-
# view ⇒ Collection::View
只读
private
视图 集合视图。
类方法摘要折叠
-
。 finalize (kill_spec, cluster) ⇒ Proc
private
完成游标以进行垃圾集合。
实例方法摘要折叠
-
# batch_size ⇒ 整数
private
获取批处理大小。
-
# close ⇒ nil
private
关闭此游标,从而释放客户端和服务器上的所有关联资源。
-
#已关闭? ⇒ true, false
private
游标是否已关闭?
-
# collection_name ⇒ string
private
获取解析的集合名称。
-
#each ⇒ 枚举器
private
遍历从查询返回的文档。
- # full_iterated? ⇒ 布尔 private
-
# get_more ⇒ Array<BSON::Document>
private
执行 getMore 命令并返回从服务器获取的批处理文档。
-
# ID ⇒ 整数
private
获取游标 ID。
-
#initialize (view, result, 服务器, options = {}) ⇒ 游标
构造函数
private
创建一个
Cursor
对象。 -
#检查⇒ string
private
获取
Cursor
的人类可读string表示形式。 - # kill_spec (connection_global_id) ⇒ 对象 private
-
# to_return ⇒ 整数
private
获取要返回的文档数量。
-
#try_next ⇒ BSON::Document | nil
private
从查询中返回一份文档(如果有)。
Retryable 中包含的方法
#read_worker 、 #select_server 、 #write_worker
构造函数详情
#initialize (view, result, server, options = {}) ⇒游标
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
创建一个Cursor
对象。
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第69行 def 初始化(查看, 结果, server, = {}) 除非 结果.is_a?(操作::结果) 提高 ArgumentError, "第二个参数必须是 Mongo::Operation::Result: #{ result .inspect } } " end @view = 查看 @server = server @initial_result = 结果 @namespace = 结果.namespace @remaining = limit if 有限? set_cursor_id(结果) if @cursor_id.nil? 提高 ArgumentError, '游标 ID 必须出现在结果中' end @connection_global_id = 结果.connection_global_id @options = @session = @options[:session] @explicitly_close = false 锁 = 互斥锁.new 除非 已关闭? 报名 ObjectSpace.define_finalizer(self, self.class.finalize(kill_spec(@connection_global_id), 集群)) end end |
实例属性详细信息
#initial_result ⇒对象(只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
99 100 101 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第99行 def Initial_result @initial_result end |
#resume_token ⇒ BSON::Document | nil (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
游标跟踪的用于变更流恢复的恢复令牌
50 51 52 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第50行 def resume_token @resume_token end |
# server ⇒对象(只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
96 97 98 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第96行 def server @server end |
# view ⇒ Collection::View (readonly)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回视图集合视图。
44 45 46 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第44行 def 查看 @view end |
类方法详细信息
。 finalize (kill_spec, cluster) ⇒ Proc
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
完成游标以进行垃圾回收。 安排此游标包含在由集群的 CursorReaper 执行的 killCursors 操作中。
110 111 112 113 114 115 116 117 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第110行 def self.finalize(kill_spec, 集群) 除非 KillSpec === kill_spec 提高 ArgumentError, " 第一个参数必须是 KillSpec: # { kill_spec .inspect } } " end proc do 集群.schedule_kill_cursor(kill_spec) end end |
实例方法详细信息
# batch_size ⇒整数
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
获取批处理大小。
261 262 263 264 265 266 267 268 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第261行 def batch_size 值 = @view.batch_size && @view.batch_size > 0 ? @view.batch_size : limit if 值 == 0 nil else 值 end end |
# close ⇒ nil
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
关闭此游标,从而释放客户端和服务器上的所有关联资源。
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第287行 def 关闭 return if 已关闭? 取消注册 read_with_one_retry do spec = { coll_name: collection_name, db_name: database.名称, cursor_id: [id], } op = 操作::killCursors.new(spec) execute_operation(op) end nil 救援 错误::OperationFailure, 错误::SocketError, 错误::SocketTimeoutError, 错误::ServerNotUsable # 错误被吞掉,因为无法通过处理错误来完成。 确保 end_session @cursor_id = 0 锁.同步 do @explicitly_close = true end end |
#已关闭? ⇒ true , false
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
游标是否已关闭?
278 279 280 281 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第278行 def 已关闭? # 原则上,@cursor_id 不应为 nil @cursor_id.nil? || @cursor_id == 0 end |
# collection_name ⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
获取解析的集合名称。
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第320行 def collection_name # 在大多数情况下,这相当于集合的名称 #驾驶员中的对象。 但是,在某些情况下(例如,当连接 # 到Atlas Data Lake),find 命令返回的命名空间 # 可能不同,这就是为什么我们要使用基于集合名称的 # 命令结果中的命名空间。 if @namespace # 通常,命名空间的集合为“ 数据库 ”。 # 但是,有时集合名称会包含句点,这 # 就是该方法连接第一个之后的所有命名空间组件的原因。 ns_components = @namespace.拆分(' 。 ') ns_components[1...ns_components.长度].连接 (JOIN)(' 。 ') else 集合.名称 end end |
#each ⇒枚举器
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
遍历从查询返回的文档。
一个游标最多只能迭代一次。 不完整迭代也是允许的。 尝试多次迭代游标会引发 InvalidCursorOperation。
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 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 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第145行 def 每 # 如果我们已经遍历了第一批(即调用了 get_more # 至少一次),服务器端的游标已前进到 # 第一个批处理,然后从头开始重新启动迭代 # 返回初始结果会丢失第二批处理中的文档 # 和后续批处理,直到游标所在的位置。 检测此 # 条件并中止迭代。 # # 在未来的驾驶员版本中,每个驱动程序要么从 # 上一次迭代结束,或者始终从 # 开始。 if @get_more_used 提高 错误::InvalidCursorOperation, '无法重新启动发出 getMore 的游标的迭代' end # 保持与2.10之前版本的兼容性 驱动程序版本,重置 # 每次开始新的迭代时,文档大量。 @documents = nil if block_given? # 由 try_next 引发的 StopIteration 会结束此循环。 循环 do 文档 = try_next if 明确关闭? 提高 错误::InvalidCursorOperation, '游标已显式关闭' end 产量 文档 if 文档 end self else 文档 = [] # 由 try_next 引发的 StopIteration 会结束此循环。 循环 do 文档 = try_next if 明确关闭? 提高 错误::InvalidCursorOperation, '游标已显式关闭' end 文档 << 文档 if 文档 end 文档 end end |
# full_iterated? ⇒布尔
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
394 395 396 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第394行 def full_iterated? !!@Fully_iterated end |
# get_more ⇒ Array<BSON::Document>
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
执行 getMore 命令并返回从服务器获取的批处理文档。
370 371 372 373 374 375 376 377 378 379 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第370行 def get_more @get_more_used = true # 现代可重试读取规范禁止重试 getMores。 # 用于重试 getMores 的传统可重试读取逻辑,但由于 # 这样做可能会导致静默数据丢失,驾驶员不再重试 # 在任何情况下都可以执行 getMore 操作。 # https://github.com/mongodb/species/blob/master/source/retryable-reads/retryable-reads.rst#qa 处理(execute_operation(get_more_operation)) end |
#id ⇒ Integer
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
游标ID 为0表示游标已在服务器上关闭。
获取游标 ID。
347 348 349 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第347行 def id @cursor_id end |
#检查⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
获取 Cursor
的人类可读string表示形式。
127 128 129 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第127行 def 检查 " #<Mongo::Cursor: 0 x #{ object_id } @view= #{ @view .inspect } } > " end |
# kill_spec (connection_global_id) ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
382 383 384 385 386 387 388 389 390 391 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第382行 def kill_spec(connection_global_id) KillSpec.new( cursor_id: id, coll_name: collection_name, db_name: database.名称, connection_global_id: connection_global_id, server_address: server.地址, 会话: @session, ) end |
#to_return ⇒ Integer
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
获取要返回的文档数量。 用于3.0及更低版本的服务器。
360 361 362 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第360行 def to_return use_limit? ? @remaining : (batch_size || 0) end |
# try_next ⇒ BSON::Document | nil
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
此方法是实验性的,可能会发生变化。
从查询中返回一份文档(如果有)。
此方法将等待来自服务器的更改长达 max_await_time_ms 毫秒,如果没有收到更改,将返回 nil。 如果没有更多文档可从服务器返回,或者游标已耗尽,则会引发 StopIteration 异常。
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 244 245 246 247 248 249 250 251 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cursor.rb', 第205行 def try_next if @documents.nil? # 由于已发布的 Mongoid 版本具有旧驾驶员游标的副本 # 代码,当 Mongoid查询时,不会调用 #进程中的 dup 调用 # 缓存处于活动状态。 通过在此处同时调用 dup 来解决此问题 # 可能来自 Mongoid 代码的 #进程的结果。 @documents = 处理(@initial_result).dup # 这里的文档可以是空数组,因此 # 我们最终可能会在第一次 try_next 调用中发出 getMore end if @documents.空? # 对于空批次,我们缓存批处理恢复令牌 cache_batch_resume_token 除非 已关闭? if 精疲力尽? 关闭 @Fully_iterated = true 提高 StopIteration end @documents = get_more else @Fully_iterated = true 提高 StopIteration end else # 游标在此处已关闭 # 将文档保留为空大量 end # 如果至少有一个文档,则缓存其_id if @documents[0] cache_resume_token(@documents[0]) end # 如果要迭代,则缓存批处理恢复令牌 # 超过最后一个文档,或者如果批次为空 if @documents.size <= 1 cache_batch_resume_token if 已关闭? @Fully_iterated = true end end return @documents.转变 end |