Docs 菜单
Docs 主页
/ / /
Laravel MongoDB
/

读取操作

在此页面上

  • Overview
  • 开始之前
  • 检索与查询匹配的文档
  • 匹配数组字段元素
  • 检索collection中的所有文档
  • Atlas Search文本字段
  • 修改行为
  • 跳过并限制结果
  • 对查询结果进行排序
  • 返回第一个结果

在本指南中,您可以了解如何使用 Laravel MongoDB 对 MongoDB collection执行查找操作。查找操作允许您根据指定的条件检索文档。

本指南介绍如何执行以下任务:

  • 检索与查询匹配的文档

  • 检索collection中的所有文档

  • Atlas Search文本字段

  • 修改查找操作行为

要运行本指南中的代码示例,请完成快速入门教程。 本教程说明如何使用示例数据设置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 MatchElement 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的 Eloquent 模型上调用get()方法。或者,您可以使用get()方法的别名all()来执行相同的操作。

使用以下语法运行匹配所有文档的查找操作:

$movies = Movie::get();

警告

Atlas样本数据集中的moviescollection包含大量数据。检索并显示此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()方法的行为:

此示例查询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 ...
...

要检索与一组条件匹配的第一个文档,请使用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()方法的更多信息,请参阅本指南的“对查询结果进行排序”部分。

后退

数据库和collection