指定要返回的文档
Overview
在本指南中,您可以学习;了解如何通过将以下选项传递给 MongoDB\Collection::find()
或MongoDB\Collection::findOne()
方法来指定从读取操作中返回哪些文档和类型:
样本数据
本指南中的示例使用Atlas示例数据集的sample_restaurants
数据库中的restaurants
集合。 要从PHP应用程序访问权限此集合,请实例化一个连接到Atlas 集群的MongoDB\Client
,并将以下值分配给$collection
变量:
$collection = $client->sample_restaurants->restaurants;
要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。
Limit
要指定读取操作返回的最大文档数,请创建一个用于设置limit
选项的大量,并将该大量作为参数传递给MongoDB\Collection::find()
方法。
以下示例查找cuisine
字段值为'Italian'
的所有餐厅,并将结果限制为5
文档:
$cursor = $collection->find( ['cuisine' => 'Italian'], ['limit' => 5] ); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},...,"name":"Isle Of Capri Resturant","restaurant_id":"40364373"} {"_id":{"$oid":"..."},...,"name":"Marchis Restaurant","restaurant_id":"40364668"} {"_id":{"$oid":"..."},...,"name":"Crystal Room","restaurant_id":"40365013"} {"_id":{"$oid":"..."},...,"name":"Forlinis Restaurant","restaurant_id":"40365098"} {"_id":{"$oid":"..."},...,"name":"Angelo Of Mulberry St.","restaurant_id":"40365293"}
提示
前面的示例根据文档在数据库中的自然顺序返回查询匹配的前五个文档。 以下部分介绍如何按指定顺序返回文档。
Sort
要按指定顺序返回文档,请创建一个设置sort
选项的大量。 设置此选项时,请包括对结果进行排序的字段和排序方向。 值为1
时,按从低到高的顺序排序;值为-1
时,按从高到低的顺序排序。 然后,将该大量作为参数传递给MongoDB\Collection::find()
或MongoDB\Collection::findOne()
方法。
以下示例返回cuisine
值为'Italian'
的所有文档,并按name
字段值的升序排序:
$cursor = $collection->find( ['cuisine' => 'Italian'], ['sort' => ['name' => 1]] ); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},...,"name":"44 Sw Ristorante & Bar","restaurant_id":"40698807"} {"_id":{"$oid":"..."},...,"name":"900 Park","restaurant_id":"41707964"} {"_id":{"$oid":"..."},...,"name":"A Voce","restaurant_id":"41434084"} ... {"_id":{"$oid":"..."},...,"name":"Zucchero E Pomodori","restaurant_id":"41189590" }
跳过
要在返回查询结果之前跳过指定数量的文档,请创建一个设置skip
选项的大量,并将该大量作为参数传递给MongoDB\Collection::find()
或MongoDB\Collection::findOne()
方法。
以下示例返回borough
字段值为'Manhattan'
的所有文档并跳过前10
文档:
$cursor = $collection->find( ['borough' => 'Manhattan'], ['skip' => 10] ); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},...,"name":"Cafe Metro","restaurant_id":"40363298"} {"_id":{"$oid":"..."},...,"name":"Lexler Deli","restaurant_id":"40363426"} {"_id":{"$oid":"..."},...,"name":"Domino'S Pizza","restaurant_id":"40363644"} ...
组合限制、排序和跳过
您可以在单个选项大量中设立limit
、 sort
和skip
选项,并将该大量作为参数传递给读取操作。 这允许您设立要返回的最大排序文档数,在返回之前跳过指定数量的文档。
5
以下示例返回cuisine
值为'Italian'
的 文档。结果按name
字段值升序排序,并跳过前10
文档:
$options = [ 'sort' => ['name' => 1], 'limit' => 5, 'skip' => 10, ]; $cursor = $collection->find(['cuisine' => 'Italian'], $options); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},...,"name":"Acqua","restaurant_id":"40871070"} {"_id":{"$oid":"..."},...,"name":"Acqua Restaurant","restaurant_id":"41591488"} {"_id":{"$oid":"..."},...,"name":"Acqua Santa","restaurant_id":"40735858"} {"_id":{"$oid":"..."},...,"name":"Acquista Trattoria","restaurant_id":"40813992"} {"_id":{"$oid":"..."},...,"name":"Acquolina Catering","restaurant_id":"41381423"}
注意
调用这些方法的顺序不会更改返回的文档。 MongoDB PHP库会自动对调用重新排序,以首先执行排序操作,然后执行跳过操作,然后执行限制操作。
指定返回类型
要自定义读取操作返回的文档的数据类型,可以在大量参数中传递typeMap
选项。
默认,对MongoDB\Client
、 MongoDB\Database
或MongoDB\Collection
实例调用的方法使用以下类型映射:
[ 'array' => 'MongoDB\Model\BSONArray', 'document' => 'MongoDB\Model\BSONDocument', 'root' => 'MongoDB\Model\BSONDocument', ]
此默认类型映射执行以下转换:
数组到
MongoDB\Model\BSONArray
对象顶级和嵌入式BSON文档到
MongoDB\Model\BSONDocument
对象
在自定义类型映射中,您可以指定转换为实现MongoDB\BSON\Unserializable
的任何类型,以及array
、 stdClass
和object
类型。
例子
以下示例返回cuisine
值为'Hawaiian'
的所有文档,并指定typeMap
选项以将文档转换为大量值:
$options = [ 'typeMap' => [ 'root' => 'array', 'document' => 'array' ] ]; $cursor = $collection->find(['cuisine' => 'Hawaiian'], $options); foreach ($cursor as $doc) { print_r($doc) . PHP_EOL; }
Array ( [_id] => MongoDB\BSON\ObjectId Object ( [oid] => ... ) [address] => Array ( ... ) [borough] => Manhattan [cuisine] => Hawaiian [grades] => Array ( ... ) [name] => Makana [restaurant_id] => 41509012 ) ...
更多信息
有关检索文档的更多信息,请参阅检索数据指南。
有关指定查询的更多信息,请参阅“指定查询”指南。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: