读取操作
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 ]); } }
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('<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 ]); } }
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 ... ...
文本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 ]); } }
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"
作为第二个参数传递。
如果您的文档在特定字段中包含重复值,您可以通过指定更多要排序的字段来处理平局。 如果其他字段包含唯一值,这可确保结果一致。
此示例查询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 ]); } }
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 ... ...
提示
要了解有关排序的更多信息,请参阅以下资源:
手册术语表中的 自然顺序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 ]); } }
Title: Statues also Die Year: 1953 Runtime: 30 IMDB Rating: 7.6 IMDB Votes: 620 Plot: A documentary of black art.
提示
要了解有关orderBy()
方法的更多信息,请参阅本指南的“对查询结果进行排序”部分。