Docs 菜单
Docs 主页
/ / /
Ruby 驱动程序
/ /

从游标访问数据

在本指南中,您可以学习;了解如何使用Ruby驾驶员从游标访问权限数据。

游标是一种以可迭代批处理方式返回读取操作结果的机制。 由于游标在任何给定时间仅保存文档的子集,因此游标可减少内存消耗和驾驶员发送到服务器的请求数量。

您无法直接从应用程序代码访问权限Mongo::Cursor 类。当您使用Ruby驾驶员执行读取操作时,驾驶员会返回一个表示查询的Mongo::Collection::View对象。从 Collection::View对象请求查询结果后,驾驶员会在内部将这些结果存储在 Cursor对象中。然后,Collection::View 会公开由 Cursor 类支持的 Enumerable 接口,您可以从该接口访问权限结果。

本指南中的示例使用 Atlas示例数据集sample_restaurants数据库中的 restaurants集合。要从Ruby应用程序访问权限此集合,请创建一个连接到Atlas 集群的Mongo::Client对象,并将以下值分配给 databasecollection 变量:

database = client.use('sample_restaurants')
collection = database[:restaurants]

要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。

要遍历游标的内容,请对读取操作返回的 Mongo::Collection::View对象调用 each 方法。这指示驾驶员执行操作并返回存储在 Mongo::Cursor 中的每个结果。

以下示例使用 find 方法检索name字段值为 "Dunkin' Donuts" 的所有文档。然后打印游标中存储的每个文档:

cursor = collection.find(name: "Dunkin' Donuts")
cursor.each do |doc|
puts doc
end
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"}
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40379573"}
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40392410"}
...

要从游标单独检索文档,请对读取操作返回的 Mongo::Collection::View对象调用 first 方法。

以下示例查找集合中 name 值为 "Dunkin' Donuts" 的所有文档。然后,它通过调用 first 方法来打印游标中的第一个文档。

cursor = collection.find(name: "Dunkin' Donuts")
first_doc = cursor.first
puts first_doc
{"_id"=>BSON::ObjectId('...'), ..., "name"=>"Dunkin' Donuts", "restaurant_id"=>"40363098"}

警告

如果查询返回的文档数量和大小超过可用的应用程序内存,程序就会崩溃。 如果需要大型结果集,请以迭代方式访问游标。

要从游标检索所有文档,请对其相应的 Mongo::Collection::View对象使用 to_a 方法,将游标转换为大量。

以下示例调用 to_a 方法将游标结果存储在大量中:

cursor = collection.find(name: "Dunkin' Donuts")
array_results = cursor.to_a

固定大小集合进行查询时,可以使用可追加游标,该游标在客户端用完游标中的结果后仍保持打开状态。要创建可追加游标,请将 cursor_type 选项传递给 find 方法。将此选项设置为 :tailable

示例,您可以创建一个名为 vegetables 的固定大小集合,如以下代码所示:

db = client.use('db')
collection = db[:vegetables, capped: true, size: 1024 * 1024]
collection.create
vegetables = [
{ name: 'cauliflower' },
{ name: 'zucchini' }
]
collection.insert_many(vegetables)

然后,可以使用以下代码检索vegetables集合中的所有文档,并将结果存储在可追加游标中。游标耗尽后,它将保持打开状态,直到检索到三个文档:

cursor = collection.find({}, cursor_type: :tailable)
docs_found = 0
cursor.each do |doc|
puts doc
docs_found += 1
break if docs_found >= 3
end
{"_id"=>BSON::ObjectId('...'), "name"=>"cauliflower"}
{"_id"=>BSON::ObjectId('...'), "name"=>"zucchini"}

如果将另一个文档插入到 vegetables集合中,前面的代码将打印新文档,而不会从游标中检索更多结果。

要学习;了解有关可追加游标的更多信息,请参阅MongoDB Server手册中的可追加游标

要学习;了解有关本指南中讨论的任何函数的更多信息,请参阅以下API文档:

后退

计算文档

在此页面上