读取操作
概述
本指南介绍了如何使用 Laravel MongoDB 在 MongoDB 集合上执行 查找操作。查找操作允许您根据您指定的标准检索文档。
本指南展示了以下任务
开始之前
要运行本指南中的代码示例,请完成快速入门教程。本教程提供了设置MongoDB Atlas实例以及创建以下文件的说明:
Movie.php
文件,其中包含一个代表movies
集合中文档的Movie
模型MovieController.php
文件,其中包含一个show()
函数来执行数据库操作browse_movies.blade.php
文件,其中包含用于显示数据库操作结果的HTML代码
以下部分描述了如何编辑您的Laravel应用程序中的文件以运行查找操作代码示例并查看预期输出。
检索符合查询的文档
您可以使用Laravel的Eloquent对象关系映射器(ORM)来创建表示MongoDB集合的模型,并对其链式调用方法来指定查询条件。
要检索符合一组条件的文档,请在对集合的相应Eloquent模型的where()
方法进行调用,然后向该方法传递一个查询过滤器。
查询过滤器指定字段值要求,并指示查找操作只返回满足这些要求的文档。
您可以使用以下where()
方法调用之一来构建查询
where('<字段名>', '<值>')
构建一个查询,该查询匹配目标字段具有精确指定值的文档where('<字段名>', '<比较运算符>', <值>)
构建一个查询,该查询匹配目标字段值满足比较标准的文档。
要将对查找操作应用多组标准,可以将一系列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 ]); } }
Title: Inception Year: 2010 Runtime: 148 IMDB Rating: 8.8 IMDB Votes: 1294646 Plot: A thief who steals corporate secrets through use of dream-sharing technology is given the inverse task of planting an idea into the mind of a CEO. Title: Senna Year: 2010 Runtime: 106 IMDB Rating: 8.6 IMDB Votes: 41904 Plot: A documentary on Brazilian Formula One racing driver Ayrton Senna, who won the F1 world championship three times before his death at age 34.
有关如何使用Laravel查询构建器而不是Eloquent ORM进行查询的说明,请参阅查询构建器页面。
匹配数组字段元素
在检索文档时,您可以指定一个查询过滤器来匹配数组字段元素。如果您的文档包含数组字段,则可以基于值是否包含所有或某些指定的数组元素来匹配文档。
您可以使用以下where()
方法调用之一来构建对数组字段的查询
where('<数组字段>', <数组>)
构建一个查询,该查询匹配数组字段值正好是指定的数组where('<数组字段>', 'in', <数组>)
构建一个查询,该查询匹配数组字段值包含指定的数组中的一个或多个元素
使用where()
方法构建查询后,链接get()
方法以检索查询结果。
从以下选项中选择精确数组匹配和元素匹配标签页,查看每种模式的查询语法
此示例检索数组countries
正好是['Indonesia', 'Canada']
的文档
$movies = Movie::where('countries', ['Indonesia', 'Canada']) ->get();
此示例检索数组countries
包含数组['Canada', 'Egypt']
中的一个值的文档
$movies = Movie::where('countries', 'in', ['Canada', 'Egypt']) ->get();
有关如何使用Laravel查询构建器而不是Eloquent ORM查询数组字段的说明,请参阅查询构建器指南中的匹配数组元素示例部分。
检索集合中的所有文档
您可以通过省略查询过滤器来检索集合中的所有文档。为了返回文档,请在表示您的集合的Eloquent模型上调用get()
方法。或者,您可以使用get()
方法的别名all()
执行相同的操作。
使用以下语法运行匹配所有文档的查找操作
$movies = Movie::get();
注意
Atlas样本数据集中的movies
集合包含大量数据。检索并显示此集合中的所有文档可能会导致您的Web应用程序超时。
为了避免此问题,请使用take()
方法指定文档限制。有关take()
的更多信息,请参阅本指南中的修改行为部分。
搜索文本字段
文本搜索检索包含文本索引字段中term
或phrase
的文档。一个term是排除空白字符的字符序列。一个phrase是由任意数量的空白字符组成的term序列。
注意
在您能够执行文本搜索之前,必须在文本值字段上创建一个文本索引。有关创建索引的更多信息,请参阅Schema Builder指南中的管理索引部分。
您可以通过使用$text运算符后跟查询过滤器中传递给where()
方法的$search
字段来执行文本搜索。该$text
运算符对文本索引字段执行文本搜索。该$search
字段指定要搜索的文本。
使用where()
方法构建查询后,链接get()
方法以检索查询结果。
此示例在Movie
Eloquent模型上调用where()
方法,以检索包含短语"love story"
的plot
字段的文档。要执行此文本搜索,集合必须在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 ]); } }
Title: Cafè de Flore Year: 2011 Runtime: 120 IMDB Rating: 7.4 IMDB Votes: 9663 Plot: A love story between a man and woman ... Title: Paheli Year: 2005 Runtime: 140 IMDB Rating: 6.7 IMDB Votes: 8909 Plot: A folk tale - supernatural love story about a ghost ... Title: Por un puèado de besos Year: 2014 Runtime: 98 IMDB Rating: 6.1 IMDB Votes: 223 Plot: A girl. A boy. A love story ... ...
文本搜索将一个数值文本分数分配给每个结果,以指示每个结果与查询过滤器中的字符串的匹配程度。您可以通过使用orderBy()
方法对textScore
元数据字段进行排序来按相关性对结果进行排序。您可以通过使用$meta运算符来访问此元数据。
$movies = Movie::where('$text', ['$search' => '"love story"']) ->orderBy('score', ['$meta' => 'textScore']) ->get();
提示
要了解有关orderBy()
方法的更多信息,请参阅本指南的排序查询结果部分。
修改行为
您可以通过将更多方法链接到where()
来修改查找操作的结果。
以下部分演示了如何修改where()
方法的行为
跳过和限制结果使用
skip()
方法设置要跳过的文档数,并使用take()
方法设置要返回的文档总数排序查询结果使用
orderBy()
方法根据字段值返回指定顺序的查询结果返回第一个结果使用
first()
方法返回与查询过滤器匹配的第一个文档
跳过和限制结果
此示例查询年份值为1999
的文档。操作跳过前两个匹配的文档,并输出总共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 ]); } }
Title: Three Kings Year: 1999 Runtime: 114 IMDB Rating: 7.2 IMDB Votes: 130677 Plot: In the aftermath of the Persian Gulf War, 4 soldiers set out to steal gold that was stolen from Kuwait, but they discover people who desperately need their help. Title: Toy Story 2 Year: 1999 Runtime: 92 IMDB Rating: 7.9 IMDB Votes: 346655 Plot: When Woody is stolen by a toy collector, Buzz and his friends vow to rescue him, but Woody finds the idea of immortality in a museum tempting. Title: Beowulf Year: 1999 Runtime: 95 IMDB Rating: 4 IMDB Votes: 9296 Plot: A sci-fi update of the famous 6th Century poem. In a besieged land, Beowulf must battle against the hideous creature Grendel and his vengeance seeking mother.
排序查询结果
要按指定字段的值对查询结果进行排序,请使用where()
方法,然后是orderBy()
方法。
您可以在结果上设置升序
或降序
排序方向。默认情况下,orderBy()
方法对提供的字段名设置升序排序,但您可以通过将"asc"
作为第二个参数传递来显式指定升序排序。要指定降序排序,请将"desc"
作为第二个参数传递。
如果您的文档在特定字段中包含重复的值,您可以通过指定更多字段来处理平局。这确保了如果其他字段包含唯一的值,则结果是一致的。
此示例查询包含"Indonesia"
的countries
字段值的文档,并按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 ]); } }
Title: Joni's Promise Year: 2005 Runtime: 83 IMDB Rating: 7.6 IMDB Votes: 702 Plot: A film delivery man promises ... Title: Gie Year: 2005 Runtime: 147 IMDB Rating: 7.5 IMDB Votes: 470 Plot: Soe Hok Gie is an activist who lived in the sixties ... Title: Requiem from Java Year: 2006 Runtime: 120 IMDB Rating: 6.6 IMDB Votes: 316 Plot: Setyo (Martinus Miroto) and Siti (Artika Sari Dewi) are young married couple ... ...
提示
有关排序的更多信息,请参阅以下资源
自然排序在服务器手册词汇表中的定义
排序、分组、限制和偏移在Laravel文档中
返回第一个结果
要检索符合一组标准的第一个文档,请使用where()
方法,然后使用first()
方法。
将orderBy()
方法链接到first()
,以在查询唯一值时获得一致的结果。如果您省略了orderBy()
方法,MongoDB将根据文档的自然顺序或它们在集合中的顺序返回匹配的文档。
此示例查询具有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 ]); } }
Title: Statues also Die Year: 1953 Runtime: 30 IMDB Rating: 7.6 IMDB Votes: 620 Plot: A documentary of black art.
提示
要了解有关orderBy()
方法的更多信息,请参阅本指南的排序查询结果部分。