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
]);
}
}

要了解如何使用 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
]);
}
}

文本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
]);
}
}

要根据指定字段的值对查询结果进行排序,请使用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
]);
}
}

提示

要了解有关排序的更多信息,请参阅以下资源:

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

后退

数据库和集合

来年

写入操作