Overview
在本指南中,您可以学习;了解如何使用 Laravel MongoDB从MongoDB集合中检索数据。本指南介绍了可用于检索数据的 Eloquent 模型方法,并提供了不同类型查找操作的示例。
要学习有关 Laravel 集成中 Eloquent 模型的更多信息,请参阅 模型数据部分。
开始之前
要运行本指南中的代码示例,请完成快速入门教程。 本教程说明如何使用示例数据设置 MongoDB Atlas 实例,并在 Laravel Web 应用程序中创建以下文件:
Movie.php文件,其中包含一个Moviemovies模型来表示collection中的文档MovieController.php文件,其中包含用于运行数据库操作的show()函数browse_movies.blade.php文件,其中包含用于显示数据库操作结果的 HTML 代码
以下部分介绍如何编辑 Laravel 应用程序中的文件以运行查找操作代码示例并查看预期输出。
检索与查询匹配的文档
您可以使用 Laravel 的 Eloquent 对象关系映射器 (ORM) 来创建表示 MongoDB 集合的模型,并在模型上使用链式方法来指定查询条件。
要检索与一设立条件匹配的文档,请对该集合的相应 Eloquent 模型调用where()方法,然后向该方法传递查询过滤。
提示
Retrieve One Document
where() 方法检索所有匹配的文档。要检索第一个匹配的文档,可以链接 first() 方法。要学习;了解更多信息和查看示例,请参阅本指南的检索第一个结果部分。
查询筛选器指定字段值要求,并指示查找操作仅返回满足这些要求的文档。
您可以使用以下where()方法调用之一来构建查询:
where('<field name>', <value>)构建一个查询,用于匹配目标字段具有确切指定值的文档where('<field name>', '<comparison operator>', <value>)构建一个查询,用于匹配目标字段值满足比较条件的文档
要将多组条件应用于查找操作,可以将一系列where()方法链接在一起。
使用where()方法构建查询后,链接get()方法以检索查询结果。
此示例在Movie Eloquent 模型上调用两个where()方法来检索满足以下条件的文档:
year字段的值为2010imdb.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 来查询大量字段,请参阅 查询构建器指南中的匹配数组元素示例部分。
检索第一个结果
要检索与一组条件匹配的第一个文档,请使用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() 方法的更多信息,请参阅修改查询结果指南中的对查询结果进行排序部分。
检索collection中的所有文档
您可以通过省略查询筛选器来检索collection中的所有文档。要返回文档,请在表示collection的 Eloquent 模型上调用get()方法。或者,您可以使用get()方法的别名all()来执行相同的操作。
使用以下语法运行匹配所有文档的查找操作:
$movies = Movie::get();
完全可运行的示例
以下部分提供可完全运行的代码示例,展示如何使用 Laravel 集成来检索文档。这些示例使用 Atlas 示例数据集 中的 sample_mflix.movies 集合。
提示
您可以从自己的 Laravel 应用程序或从开始使用教程中创建的 my-app 应用程序运行完整示例。这些示例使用此教程中创建的 Movie.php 模型类来演示 movies MongoDB 集合上的操作。要运行该操作,可以将示例代码复制到 Laravel 应用程序中的控制器终结点。
要查看操作的预期输出,您可以将 Web 路由添加到应用程序,该应用程序调用控制器函数并将结果返回到 Web 界面。
查找文档
从以下 Eloquent 和 Query Builder 标签页中选择,查看每个相应查询语法的示例:
此示例将执行以下动作:
使用
MovieEloquent 模型表示sample_mflix数据库中的movies集合从
movies集合中检索与查询筛选器匹配的文档打印检索到的文档
该示例在Movie模型上调用以下方法:
where():匹配其中directors字段的值包含"Rob Reiner"的文档orderBy():按_id值升序对匹配的文档进行排序first():仅检索第一个匹配的文档
$movie = Movie::where('directors', 'Rob Reiner') ->orderBy('id') ->first(); echo $movie->toJson();
此示例将执行以下动作:
通过从
DB门面调用table()方法来访问movies集合从
movies集合中检索与查询筛选器匹配的文档打印检索到的文档的
title字段
该示例调用以下查询构建器方法:
where():匹配其中directors字段的值包含"Rob Reiner"的文档orderBy():按_id值升序对匹配的文档进行排序first():仅检索第一个匹配的文档
$movie = DB::table('movies') ->where('directors', 'Rob Reiner') ->orderBy('_id') ->first(); echo $movie->title;
查找多个文档
从以下 Eloquent 和 Query Builder 标签页中选择,查看每个相应查询语法的示例:
此示例将执行以下动作:
使用
MovieEloquent 模型表示sample_mflix数据库中的movies集合从
movies集合中检索并打印与查询筛选器匹配的文档
该示例在Movie模型上调用以下方法:
where():匹配runtime字段的值大于900的文档orderBy():按_id值升序对匹配的文档进行排序get():以 Laravel集合对象的形式检索查询结果
$movies = Movie::where('runtime', '>', 900) ->orderBy('id') ->get();
此示例将执行以下动作:
通过从
DB门面调用table()方法来访问movies集合从
movies集合中检索并打印与查询筛选器匹配的文档
该示例调用以下查询构建器方法:
where():匹配runtime字段的值大于900的文档orderBy():按_id值升序对匹配的文档进行排序get():以 Laravel集合对象的形式检索查询结果
$movies = DB::table('movies') ->where('runtime', '>', 900) ->orderBy('_id') ->get();
计算文档
从以下 Eloquent 和 Query Builder 标签页中选择,查看每个相应查询语法的示例:
此示例将执行以下动作:
使用
MovieEloquent 模型表示sample_mflix数据库中的movies集合计算
movies集合中与查询过滤匹配的文档数量打印匹配的文档计数
该示例在Movie模型上调用以下方法:
where():匹配其中genres字段的值包含"Biography"的文档count():计算匹配文档的数量,并以整数形式返回计数
$count = Movie::where('genres', 'Biography') ->count(); echo 'Number of documents: ' . $count;
此示例将执行以下动作:
通过从
DB门面调用table()方法来访问movies集合计算
movies集合中与查询过滤匹配的文档数量打印匹配的文档计数
该示例调用以下查询构建器方法:
where():匹配其中genres字段的值包含"Biography"的文档count():计算匹配文档的数量,并以整数形式返回计数
$count = DB::table('movies') ->where('genres', 'Biography') ->count(); echo 'Number of documents: ' . $count;
检索不同字段值
从以下 Eloquent 和 Query Builder 标签页中选择,查看每个相应查询语法的示例:
此示例将执行以下动作:
使用
MovieEloquent 模型表示sample_mflix数据库中的movies集合从
movies集合中检索与查询筛选器匹配的文档的不同字段值打印非重复值
该示例在Movie模型上调用以下方法:
where():匹配其中directors字段的值包含"Sofia Coppola"的文档select():检索匹配文档的imdb.rating字段值distinct():检索所选字段的唯一值并返回值列表get():检索查询结果
$ratings = Movie::where('directors', 'Sofia Coppola') ->select('imdb.rating') ->distinct() ->get(); echo $ratings;
此示例将执行以下动作:
通过从
DB门面调用table()方法来访问movies集合从
movies集合中检索与查询筛选器匹配的文档的不同字段值打印非重复值
该示例调用以下查询构建器方法:
where():匹配其中directors字段的值包含"Sofia Coppola"的文档select():检索匹配文档的imdb.rating字段值distinct():检索所选字段的唯一值并返回值列表get():检索查询结果
$ratings = DB::table('movies') ->where('directors', 'Sofia Coppola') ->select('imdb.rating') ->distinct() ->get(); echo $ratings;
更多信息
要了解如何将数据插入 MongoDB,请参阅插入文档指南。
要学习;了解如何修改 Laravel 集成返回结果的方式,请参阅 修改查询结果 指南。