检索数据
概述
在本指南中,您可以了解如何使用MongoDB PHP库通过使用读取操作从MongoDB集合中检索数据。您可以调用MongoDB\Collection::find()
或MongoDB\Collection::findOne()
方法在集合上检索符合一组条件的文档。
示例数据
本指南中的示例使用来自sample_training
数据库的companies
集合。要从您的PHP应用程序访问此集合,实例化一个连接到Atlas集群的MongoDB\Client
并将以下值分配给您的$collection
变量
$collection = $client->sample_training->companies;
要了解如何创建免费的MongoDB Atlas集群并加载示例数据集,请参阅使用Atlas入门指南。
查找文档
MongoDB PHP 库提供了两种从集合中检索文档的方法:MongoDB\Collection::findOne()
和 MongoDB\Collection::find()
。这些方法需要一个 查询过滤器 并返回一个或多个匹配的文档。查询过滤器指定了驱动程序在查询中用于检索文档的搜索条件。
技巧
要了解更多关于查询过滤器的信息,请参阅指定查询指南。
查找单个文档
要在一个集合中查找单个文档,请调用 MongoDB\Collection::findOne()
方法,并传递一个查询过滤器,该过滤器指定了要查找的文档的条件。
findOne()
方法返回一个 array
、object
或 null
值。如果查询过滤器匹配一个文档,该方法返回一个包含该文档的 array|object
实例。返回类型取决于 typeMap
选项的值。如果查询过滤器没有匹配任何文档,则返回 null
。
技巧
要了解有关 findOne()
选项(如 typeMap
)的更多信息,请参阅本指南的 修改查找行为 部分。
如果查询过滤器匹配多个文档,则 findOne()
方法返回检索结果中的 第一个 匹配文档。
以下示例使用 findOne()
方法查找第一个 name
字段值为 'LinkedIn'
的文档。
$document = $collection->findOne(['name' => 'LinkedIn']); echo json_encode($document), PHP_EOL;
{"_id":{"$oid":"..."},"name":"LinkedIn","permalink":"linkedin","crunchbase_url": "http:\/\/www.crunchbase.com\/company\/linkedin","homepage_url":"http:\/\/linkedin.com", ... }
查找多个文档
要在一个集合中查找多个文档,请将查询过滤器传递给 MongoDB\Collection::find()
方法,该过滤器指定了要检索的文档的条件。
以下示例使用 find()
方法来查找所有在 founded_year
字段值为 1970
的文档。
$results = $collection->find(['founded_year' => 1970]);
find()
方法返回一个 MongoDB\Driver\Cursor
实例,您可以通过迭代来查看匹配的文档。游标是一种机制,允许应用程序在给定时间内存中仅保留数据库结果的一个子集的情况下迭代数据库结果。当您的 find()
方法返回大量文档时,游标非常有用。
您可以使用 foreach
循环迭代游标中的文档,如下面的示例所示。
foreach ($results as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},"name":"Mitsubishi Motors","permalink":"mitsubishi-motors", "crunchbase_url":"http:\/\/www.crunchbase.com\/company\/mitsubishi-motors", ... } {"_id":{"$oid":"..."},"name":"Western Digital","permalink":"western-digital", "crunchbase_url":"http:\/\/www.crunchbase.com\/company\/western-digital", ... } {"_id":{"$oid":"..."},"name":"Celarayn","permalink":"celarayn","crunchbase_url": "http:\/\/www.crunchbase.com\/company\/celarayn", ... }
注意
查找所有文档
要查找集合中的所有文档,请将空过滤器传递给 find()
方法。
$cursor = $collection->find([]);
修改查找行为
您可以通过传递一个指定选项值的数组作为参数来修改 MongoDB\Collection::find()
和 MongoDB\Collection::findOne()
方法的行为。以下表格描述了您可以在数组中设置的某些选项。
选项 | 描述 |
---|---|
batchSize | 每批返回的文档数量。默认值为 101 。类型: integer |
collation | 用于操作的排序规则。默认值是集合中指定的排序规则。 类型: array|object |
comment | 要将操作附加到的注释。 类型: 任何 BSON 类型 |
cursorType | 用于操作的游标类型。默认值为 MongoDB\Operation\Find::NON_TAILABLE 。类型: MongoDB\Operation\Find |
limit | 操作可以返回的最大文档数。 类型: integer |
skip | 在返回结果之前要跳过的文档数。 类型: integer |
sort | 操作返回匹配文档的顺序。 类型: array|object |
typeMap | 应用于游标的数据类型映射,它决定了如何将 BSON 文档转换为 PHP 值。默认值为集合的数据类型映射。 类型: array |
以下示例使用 find()
方法查找所有在 number_of_employees
字段值为 1000
的文档。示例使用 limit
选项返回最多 5
个结果。
$results = $collection->find( ['number_of_employees' => 1000], ['limit' => 5] ); foreach ($results as $doc) { echo json_encode($doc), PHP_EOL; }
附加信息
要了解更多关于查询过滤器的信息,请参阅指定查询指南。
要查看使用MongoDB PHP库检索文档的代码示例,请参阅从MongoDB读取数据。
API 文档
要了解更多关于本指南中讨论的任何方法,请参阅以下API文档