对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

Retrieve MongoDB Data

在本指南中,您可以学习;了解如何使用 Laravel MongoDB从MongoDB集合中检索数据。本指南介绍了可用于检索数据的 Eloquent 模型方法,并提供了不同类型查找操作的示例。

要学习;了解有关 Laravel 集成中的 Eloquent 模型的更多信息,请参阅对数据进行建模部分。

要运行本指南中的代码示例,请完成快速入门教程。 本教程说明如何使用示例数据设置 MongoDB Atlas 实例,并在 Laravel Web 应用程序中创建以下文件:

  • Movie.php 文件,其中包含一个Movie movies模型来表示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 字段的值为 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 来查询大量字段,请参阅 查询构建器指南中的匹配数组元素示例部分。

要检索与一组条件匹配的第一个文档,请使用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中的所有文档。要返回文档,请在表示collection的 Eloquent 模型上调用get()方法。或者,您可以使用get()方法的别名all()来执行相同的操作。

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

$movies = Movie::get();

警告

Atlas样本数据集中的moviescollection包含大量数据。检索并显示此collection中的所有文档可能会导致 Web 应用程序超时。

要避免此问题,请使用 take() 方法指定文档限制。take()有关 的更多信息,请参阅“修改查询输出”指南中的“修改查询结果”部分。

以下部分提供了完全可运行的代码示例,演示了如何使用 Laravelsample_mflix.movies 集成来检索文档。这些示例使用Atlas示例数据集中的 集合。

提示

您可以从自己的 Laravel应用程序或入门教程中创建的my-app 应用程序运行完整示例。这些示例使用本教程中创建的Movie.php 模型类来演示movies MongoDB集合上的操作。要运行该操作,您可以将示例代码复制到 Laravel应用程序中的控制器端点。

要查看操作的预期输出,您可以将 Web 路由添加到应用程序,该应用程序调用控制器函数并将结果返回到 Web 界面。

从以下 EloquentQuery Builder 标签页中进行选择,以查看每个相应查询语法的示例:

此示例将执行以下动作:

  • 使用Movie Eloquent 模型表示sample_mflix数据库中的movies集合

  • movies集合中检索与查询筛选器匹配的文档

  • 打印检索到的文档

该示例在Movie模型上调用以下方法:

  • where():匹配其中 directors字段的值包含 "Rob Reiner" 的文档

  • orderBy():按 _id 值升序对匹配的文档进行排序

  • first():仅检索第一个匹配的文档

$movie = Movie::where('directors', 'Rob Reiner')
->orderBy('id')
->first();
echo $movie->toJson();
// Result is truncated
{
"_id": ...,
"title": "This Is Spinal Tap",
"directors": [ "Rob Reiner" ],
...
}

此示例将执行以下动作:

  • 通过从 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;
This Is Spinal Tap

从以下 EloquentQuery Builder 标签页中进行选择,以查看每个相应查询语法的示例:

此示例将执行以下动作:

  • 使用Movie Eloquent 模型表示sample_mflix数据库中的movies集合

  • movies集合中检索并打印与查询筛选器匹配的文档

该示例在Movie模型上调用以下方法:

  • where():匹配 runtime字段的值大于 900 的文档

  • orderBy():按 _id 值升序对匹配的文档进行排序

  • get():以 Laravel集合对象的形式检索查询结果

$movies = Movie::where('runtime', '>', 900)
->orderBy('id')
->get();
// Results are truncated
[
{
"_id": ...,
"runtime": 1256,
"title": "Centennial",
...,
},
{
"_id": ...,
"runtime": 1140,
"title": "Baseball",
...,
},
...
]

此示例将执行以下动作:

  • 通过从 DB 门面调用 table() 方法来访问 movies集合

  • movies集合中检索并打印与查询筛选器匹配的文档

该示例调用以下查询构建器方法:

  • where():匹配 runtime字段的值大于 900 的文档

  • orderBy():按 _id 值升序对匹配的文档进行排序

  • get():以 Laravel集合对象的形式检索查询结果

$movies = DB::table('movies')
->where('runtime', '>', 900)
->orderBy('_id')
->get();
// Results are truncated
[
{
"_id": ...,
"runtime": 1256,
"title": "Centennial",
...,
},
{
"_id": ...,
"runtime": 1140,
"title": "Baseball",
...,
},
...
]

从以下 EloquentQuery Builder 标签页中进行选择,以查看每个相应查询语法的示例:

此示例将执行以下动作:

  • 使用Movie Eloquent 模型表示sample_mflix数据库中的movies集合

  • 计算movies集合中与查询过滤匹配的文档数量

  • 打印匹配的文档计数

该示例在Movie模型上调用以下方法:

  • where():匹配其中 genres字段的值包含 "Biography" 的文档

  • count():计算匹配文档的数量,并以整数形式返回计数

$count = Movie::where('genres', 'Biography')
->count();
echo 'Number of documents: ' . $count;
Number of documents: 1267

此示例将执行以下动作:

  • 通过从 DB 门面调用 table() 方法来访问 movies集合

  • 计算movies集合中与查询过滤匹配的文档数量

  • 打印匹配的文档计数

该示例调用以下查询构建器方法:

  • where():匹配其中 genres字段的值包含 "Biography" 的文档

  • count():计算匹配文档的数量,并以整数形式返回计数

$count = DB::table('movies')
->where('genres', 'Biography')
->count();
echo 'Number of documents: ' . $count;
Number of documents: 1267

从以下 EloquentQuery Builder 标签页中进行选择,以查看每个相应查询语法的示例:

此示例将执行以下动作:

  • 使用Movie Eloquent 模型表示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;
[[5.6],[6.4],[7.2],[7.8]]

此示例将执行以下动作:

  • 通过从 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;
[5.6,6.4,7.2,7.8]

要学习;了解如何将数据插入MongoDB,请参阅插入文档指南。

要学习;了解如何修改 Laravel 集成返回结果的方式,请参阅 修改查询结果 指南。