Docs 菜单

指定要返回的文档

在本指南中,您可以学习;了解如何通过将以下选项传递给 MongoDB\Collection::find()MongoDB\Collection::findOne()方法来指定从读取操作中返回哪些文档和类型:

  • limit :指定查询返回的最大文档数

  • sort :指定返回文档的排序顺序

  • skip :指定在返回查询结果之前要跳过的文档数

  • typeMap :将返回的文档转换为指定的数据类型

本指南中的示例使用Atlas示例数据集sample_restaurants数据库中的restaurants集合。 要从PHP应用程序访问权限此集合,请实例化一个连接到Atlas 集群的MongoDB\Client ,并将以下值分配给$collection变量:

$collection = $client->sample_restaurants->restaurants;

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

要指定读取操作返回的最大文档数,请创建一个用于设置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选项的大量。 设置此选项时,请包括对结果进行排序的字段和排序方向。 值为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"}
...

您可以在单个选项大量中设立limitsortskip选项,并将该大量作为参数传递给读取操作。 这允许您设立要返回的最大排序文档数,在返回之前跳过指定数量的文档。

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\ClientMongoDB\DatabaseMongoDB\Collection实例调用的方法使用以下类型映射:

[
'array' => 'MongoDB\Model\BSONArray',
'document' => 'MongoDB\Model\BSONDocument',
'root' => 'MongoDB\Model\BSONDocument',
]

此默认类型映射执行以下转换:

  • 数组到MongoDB\Model\BSONArray对象

  • 顶级和嵌入式BSON文档到MongoDB\Model\BSONDocument对象

在自定义类型映射中,您可以指定转换为实现MongoDB\BSON\Unserializable的任何类型,以及arraystdClassobject类型。

以下示例返回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 文档: