从游标访问数据
Overview
在本指南中,您可以学习;了解如何使用MongoDB PHP库从游标访问权限数据。
游标是一种以可迭代批处理方式返回读取操作结果的机制。 游标在任何给定时间仅保存文档的子集,而不是一次返回所有文档,从而减少内存消耗和服务器请求数量。
每当MongoDB PHP库使用 MongoDB\Collection::find()
方法执行读取操作时,它都会在MongoDB\Driver\Cursor
实例中返回匹配的文档。
样本数据
本指南中的示例使用 Atlas示例数据集的sample_restaurants
数据库中的restaurants
集合。 要从PHP应用程序访问权限此集合,请实例化一个连接到Atlas 集群的MongoDB\Client
,并将以下值分配给$collection
变量:
$collection = $client->sample_restaurants->restaurants;
要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。
以迭代方式访问游标内容
MongoDB\Driver\Cursor
类实现了Iterator
接口,因此您可以使用foreach
循环来遍历其内容。
以下示例使用MongoDB\Collection::find()
方法检索name
字段值为'Dunkin' Donuts'
的所有文档。 然后,它会打印find()
方法返回的游标中的每个文档:
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40379573"} {"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40363098"} {"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40395071"} ...
分别检索文档
要从游标检索单个文档,请在MongoDB\Driver\Cursor
实例上调用current()
方法。 此方法返回游标最初指向的文档。 您可以通过调用next()
方法继续使游标前进,该方法指示游标点下一个检索到的文档。
以下示例查找其中name
字段值为'Dunkin' Donuts'
的所有文档。 然后,它通过在游标上调用current()
方法来打印检索到的第一个文档:
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); $cursor->rewind(); echo json_encode($cursor->current());
{"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40379573"}
检索所有文档
警告
如果查询返回的文档数量和大小超过可用的应用程序内存,程序就会崩溃。 如果需要大型结果集,请以迭代方式访问游标。
要从游标检索所有文档,请使用以下方法之一将游标转换为大量:
MongoDB\\Driver\\Cursor::toArray()
:调用MongoDB\Driver\Cursor
对象iterator_to_array()
:将MongoDB\Driver\Cursor
对象作为参数传递
以下示例对游标调用toArray()
方法,将其结果存储在大量中:
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); $array_results = $cursor->toArray();
可追加游标
对固定大小固定大小集合进行查询时,可以使用可可追加游标,该游标在客户端用完游标中的结果后仍保持打开状态。 要创建可可追加游标,请在大量中将cursorType
选项设立为MongoDB\Operation\Find::TAILABLE
。 然后,将该大量作为选项参数传递给MongoDB\Collection::find()
方法。
示例,您可以创建一个名为vegetables
的固定大小固定大小集合来存储表示蔬菜的文档,如以下代码所示:
$db = $client->db; $create_coll = $db->createCollection( 'vegetables', ['capped' => true, 'size' => 1024 * 1024] ); $vegetables = [ ['name' => 'cauliflower'], ['name' => 'zucchini'] ]; $collection = $db->vegetables; $result = $collection->insertMany($vegetables);
以下代码使用可可追加游标来检索vegetables
集合中的所有文档。 游标耗尽后,它将保持打开状态,直到检索到三个文档:
$cursor = $collection->find([], ['cursorType' => MongoDB\Operation\Find::TAILABLE]); $cursor->rewind(); $docs_found = 0; while ($docs_found < 3) { if ($cursor->valid()) { $doc = $cursor->current(); echo json_encode($doc), PHP_EOL; $docs_found++; } $cursor->next(); }
{"_id":{"$oid":"..."},"name":"cauliflower"} {"_id":{"$oid":"..."},"name":"zucchini"}
如果将另一个文档插入到vegetables
集合中,前面的代码将打印新文档并关闭while
循环。
要学习;了解有关可追加游标的更多信息,请参阅MongoDB Server手册中的可追加游标。
更多信息
要学习;了解有关读取操作的更多信息,请参阅检索数据指南。
要学习;了解有关游标的更多信息,请参阅扩展API文档中的以下页面:
API 文档
要学习;了解有关find()
方法的更多信息,请参阅MongoDB\Collection::find()
的API文档。