Overview
在本指南中,您可以学习;了解如何使用Ruby驾驶员从游标访问权限数据。
游标是一种以可迭代批处理方式返回读取操作结果的机制。 由于游标在任何给定时间仅保存文档的子集,因此游标可减少内存消耗和驾驶员发送到服务器的请求数量。
您无法直接从应用程序代码访问权限Mongo::Cursor
类。当您使用Ruby驾驶员执行读取操作时,驾驶员会返回一个表示查询的Mongo::Collection::View
对象。从 Collection::View
对象请求查询结果后,驾驶员会在内部将这些结果存储在 Cursor
对象中。然后,Collection::View
会公开由 Cursor
类支持的 Enumerable
接口,您可以从该接口访问权限结果。
样本数据
本指南中的示例使用 Atlas示例数据集的 sample_restaurants
数据库中的 restaurants
集合。要从Ruby应用程序访问权限此集合,请创建一个连接到Atlas 集群的Mongo::Client
对象,并将以下值分配给 database
和 collection
变量:
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 文档
要学习;了解有关本指南中讨论的任何函数的更多信息,请参阅以下API文档: