读取操作
Overview
在本指南中,您可以了解如何使用 Laravel MongoDB 对 MongoDB collection执行查找操作。查找操作允许您根据指定的条件检索文档。
本指南介绍如何执行以下任务:
开始之前
要运行本指南中的代码示例,请完成快速入门教程。 本教程说明如何使用示例数据设置MongoDB Atlas实例,并在 Laravel Web应用程序中创建以下文件:
Movie.php
文件,其中包含一个Movie
movies
模型来表示collection中的文档MovieController.php
文件,其中包含用于运行数据库操作的show()
函数browse_movies.blade.php
文件,其中包含用于显示数据库操作结果的 HTML 代码
以下部分介绍如何编辑 Laravel 应用程序中的文件以运行查找操作代码示例并查看预期输出。
检索与查询匹配的文档
您可以使用 Laravel 的 Eloquent 对象关系映射器 (ORM) 来创建表示 MongoDB 集合的模型,并在模型上使用链式方法来指定查询条件。
要检索与一设立条件匹配的文档,请对该集合的相应 Eloquent 模型调用where()
方法,然后向该方法传递查询过滤。
查询筛选器指定字段值要求,并指示查找操作仅返回满足这些要求的文档。
您可以使用以下where()
方法调用之一来构建查询:
where('<field name>', <value>)
构建一个查询,用于匹配目标字段具有确切指定值的文档where('<field name>', '<comparison operator>', <value>)
构建一个查询,用于匹配目标字段值满足比较条件的文档
要将多组条件应用于查找操作,可以将一系列where()
方法链接在一起。
使用where()
方法构建查询后,链接get()
方法以检索查询结果。
此示例在Movie
Eloquent 模型上调用两个where()
方法来检索满足以下条件的文档:
year
字段的值为2010
imdb.rating
嵌套字段的值大于8.5
使用以下语法指定查询:
$movies = Movie::where('year', 2010) ->where('imdb.rating', '>', 8.5) ->get();
要在browse_movies
视图中查看查询结果,请编辑MovieController.php
文件中的show()
函数,使其类似于以下代码:
class MovieController { public function show() { $movies = Movie::where('year', 2010) ->where('imdb.rating', '>', 8.5) ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
要了解如何使用 Laravel 查询构建器而不是 Eloquent ORM 进行查询,请参阅查询构建器页面。
匹配数组字段元素
您可以指定查询过滤,以便在检索文档时匹配大量字段元素。 如果您的文档包含大量字段,您可以根据该值是否包含全部或部分指定大量元素来匹配文档。
您可以使用以下where()
方法调用之一对大量字段构建查询:
where('<array field>', <array>)
构建一个查询,用于匹配大量字段值与指定大量完全相同的文档where('<array field>', 'in', <array>)
构建一个查询,用于匹配大量字段值包含一个或多个指定大量元素的文档
使用where()
方法构建查询后,链接get()
方法以检索查询结果。
从以下 Exact Array Match和Element Match标签页中进行选择,以查看每个模式的查询语法:
此示例检索其中的countries
大量恰好为['Indonesia', 'Canada']
的文档:
$movies = Movie::where('countries', ['Indonesia', 'Canada']) ->get();
此示例检索countries
大量包含大量['Canada', 'Egypt']
中的某一值的文档:
$movies = Movie::where('countries', 'in', ['Canada', 'Egypt']) ->get();
要学习;了解如何使用 Laravel查询构建器而不是 Eloquent ORM 来查询大量字段,请参阅 查询构建器指南中的匹配数组元素示例部分。
检索collection中的所有文档
您可以通过省略查询筛选器来检索collection中的所有文档。要返回文档,请在表示collection的 Eloquent 模型上调用get()
方法。或者,您可以使用get()
方法的别名all()
来执行相同的操作。
使用以下语法运行匹配所有文档的查找操作:
$movies = Movie::get();
警告
Atlas样本数据集中的movies
collection包含大量数据。检索并显示此collection中的所有文档可能会导致 Web 应用程序超时。
要避免此问题,请使用take()
方法指定文档限制。 有关take()
的更多信息,请参阅本指南的“修改行为”部分。
Atlas Search文本字段
文本Atlas Search会检索在文本索引字段中包含术语或短语的文档。 术语是不包括空白字符的字符序列。 短语是具有任意数量的空白字符的一系列术语。
您可以执行文本Atlas Search ,方法是使用$text操作符,然后使用查询筛选器中传递给 where()
方法的 $search
字段。 $text
操作符对文本索引字段执行文本Atlas Search 。 $search
字段指定要Atlas Search的文本。
使用where()
方法构建查询后,链接get()
方法以检索查询结果。
此示例在Movie
Eloquent 模型上调用where()
方法,以检索plot
字段包含短语"love story"
的文档。 要执行此文本Atlas Search ,集合必须在 plot
字段上具有文本索引。
使用以下语法指定查询:
$movies = Movie::where('$text', ['$search' => '"love story"']) ->get();
要在browse_movies
视图中查看查询结果,请编辑MovieController.php
文件中的show()
函数,使其类似于以下代码:
class MovieController { public function show() { $movies = Movie::where('$text', ['$search' => '"love story"']) ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
文本Atlas Search会分配一个数字文本分数,以指示每个结果与查询筛选器中的string的匹配程度。 您可以使用orderBy()
方法对textScore
元数据字段进行排序,从而按相关性对结果进行排序。 您可以使用$meta操作符访问此元数据:
$movies = Movie::where('$text', ['$search' => '"love story"']) ->orderBy('score', ['$meta' => 'textScore']) ->get();
提示
要了解有关orderBy()
方法的更多信息,请参阅本指南的“对查询结果进行排序”部分。
修改行为
您可以通过将更多方法链接到where()
来修改查找操作的结果。
以下部分演示如何修改where()
方法的行为:
跳过和限制结果使用
skip()
方法设置要跳过的文档数,使用take()
方法设置要返回的文档总数对查询结果进行排序使用
orderBy()
方法根据字段值按指定顺序返回查询结果返回第一个结果使用
first()
方法返回与查询筛选器匹配的第一个文档
跳过并限制结果
此示例查询year
值为1999
的文档。 该操作会跳过前2
匹配文档,总共输出3
文档。
使用以下语法指定查询:
$movies = Movie::where('year', 1999) ->skip(2) ->take(3) ->get();
要在browse_movies
视图中查看查询结果,请编辑MovieController.php
文件中的show()
函数,使其类似于以下代码:
class MovieController { public function show() { $movies = Movie::where('year', 1999) ->skip(2) ->take(3) ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
对查询结果进行排序
要根据指定字段的值对查询结果进行排序,请使用where()
方法,然后使用orderBy()
方法。
您可以对结果设置升序或降序排序。 默认情况下, orderBy()
方法对提供的字段名称设置升序排序,但您可以通过将"asc"
作为第二个参数传递来显式指定升序排序。 要指定降序排序,请将"desc"
作为第二个参数传递。
如果您的文档在特定字段中包含重复值,您可以通过指定更多要排序的字段来处理平局。 如果其他字段包含唯一值,这可确保结果一致。
此示例查询countries
字段的值包含"Indonesia"
的文档,并首先对year
字段进行升序排序,然后对title
字段进行降序排序。
使用以下语法指定查询:
$movies = Movie::where('countries', 'Indonesia') ->orderBy('year') ->orderBy('title', 'desc') ->get();
要在browse_movies
视图中查看查询结果,请编辑MovieController.php
文件中的show()
函数,使其类似于以下代码:
class MovieController { public function show() { $movies = Movie::where('countries', 'Indonesia') ->orderBy('year') ->orderBy('title', 'desc') ->get(); return view('browse_movies', [ 'movies' => $movies ]); } }
提示
要了解有关排序的更多信息,请参阅以下资源:
手册术语表中的 自然顺序MongoDB Server
排序、分组、限制和偏移 在 Laravel 文档中
返回第一个结果
要检索与一组条件匹配的第一个文档,请使用where()
方法,然后使用first()
方法。
当您查询唯一值时,将orderBy()
方法链接到first()
以获取一致的结果。 如果省略orderBy()
方法,MongoDB 将根据文档的存储顺序或它们在collection中的显示顺序返回匹配的文档。
此示例查询runtime
字段值为30
的文档,并根据_id
字段的值返回第一个匹配的文档。
使用以下语法指定查询:
$movie = Movie::where('runtime', 30) ->orderBy('_id') ->first();
要在browse_movies
视图中查看查询结果,请编辑MovieController.php
文件中的show()
函数,使其类似于以下代码:
class MovieController { public function show() { $movie = Movie::where('runtime', 30) ->orderBy('_id') ->first(); return view('browse_movies', [ 'movies' => $movie ]); } }
提示
要了解有关orderBy()
方法的更多信息,请参阅本指南的“对查询结果进行排序”部分。