Docs 菜单
Docs 主页
/ / /
Laravel MongoDB

查询构建器

在此页面上

  • 概述
  • 开始之前
  • 检索匹配文档
  • where 方法示例
  • 逻辑条件操作
  • 范围和类型检查
  • 文本模式匹配示例
  • 检索非重复值
  • 聚合(Aggregation)
  • 修改查询结果
  • 排序结果示例
  • 省略指定数量的结果示例
  • 在结果示例中显示字段和数组值的子集
  • 对结果进行分页示例
  • 使用 MongoDB 操作检索数据
  • 包含字段示例
  • 包含所有字段示例
  • 匹配数组大小示例
  • 匹配数据类型示例
  • 匹配使用模计算的值示例
  • 匹配正则表达式
  • 运行 MongoDB 查询 API 操作示例
  • 匹配数组元素示例
  • 指定游标超时示例
  • 使用地理空间操作匹配位置
  • 邻近位置示例
  • 在区域内示例
  • 相交几何图形示例
  • 附近匹配的邻近数据示例
  • 使用 MongoDB 写操作写入数据
  • 更新或插入文档示例
  • 递增数值示例
  • 递减数值示例
  • 添加数组元素示例
  • 删除数组元素示例
  • 删除字段示例

在本指南中,您可以了解如何使用 Laravel 查询构建器的 Laravel MongoDB扩展来处理MongoDB database 。 查询构建器允许您使用单一语法和流畅的界面为任何支持的数据库编写查询。

注意

Laravel MongoDB 扩展了 Laravel 的查询构建器和 Eloquent ORM,它们可以运行类似的数据库操作。要了解有关使用 Eloquent 模型检索文档的更多信息,请参阅读取操作。

Laravel 提供了一个门面来访问查询构建器类 DB ,它允许您执行数据库操作。 外观是类的静态接口,它使语法更加简洁,避免运行时错误并提高可测试性。

Laravel MongoDB 将DB方法table()别名为collection()方法。 用于指定命令和任何约束的链式方法。 然后,在末尾链接get()方法以运行这些方法并检索结果。 以下示例显示了查询构建器调用的事务语法:

DB::collection('<collection name>')
// chain methods by using the "->" object operator
->get();

提示

在使用DB::collection()方法之前,请确保将 MongoDB 指定为应用程序的默认数据库连接。 有关设置数据库连接的说明,请参阅快速入门中的配置 MongoDB 连接步骤。

如果 MongoDB 不是应用程序的默认数据库,则可以使用DB::connection()方法指定 MongoDB 连接。 将连接名称传递给connection()方法,如以下代码所示:

$connection = DB::connection('mongodb');

本指南提供了以下类型的查询构建器操作的示例:

  • 检索匹配文档

  • 修改查询结果

  • 使用 MongoDB 操作检索数据

  • 使用 MongoDB 写操作写入数据

要运行本指南中的代码示例,请完成快速入门教程以配置 Web 应用程序,将示例数据集加载到 MongoDB 部署中,并从控制器方法运行示例代码。 要查看 JSON 文档形式的预期代码输出,请使用快速入门的可选查看 JSON 文档形式的结果步骤中显示的toJson()方法。

要使用查询构建器执行读取和写入操作,请导入Illuminate\Support\Facades\DB门面并编写查询。

本部分包括以下操作符类别中读取操作的查询构建器示例:

以下示例演示如何使用where()查询构建器方法从movies集合中检索包含imdb.rating字段值恰好为9.3的文档。 单击 VIEW OUTPUT按钮查看查询返回的结果:

$result = DB::connection('mongodb')
->collection('movies')
->where('imdb.rating', 9.3)
->get();

本节中的示例显示可用于执行以下逻辑条件操作的查询构建器语法:

以下示例展示了如何链接orWhere()查询构建器方法以从movies集合中检索与1955year值匹配或与title"Back to the Future"匹配的文档:

$result = DB::connection('mongodb')
->collection('movies')
->where('year', 1955)
->orWhere('title', 'Back to the Future')
->get();

以下示例展示了如何链式使用where() 查询构建器方法,从movies imdb.rating集合中检索同时匹配大于8.5 的 值和小于year1940 值的文档:

$result = DB::connection('mongodb')
->collection('movies')
->where('imdb.rating', '>', 8.5)
->where('year', '<', 1940)
->get();

以下示例演示如何调用whereNot()查询构建器方法从movies集合中检索与imdb.rating值不大于2的文档匹配的文档。 这相当于匹配所有imdb.rating小于或等于2的文档:

$result = DB::connection('mongodb')
->collection('movies')
->whereNot('imdb.rating', '>', 2)
->get();

以下示例展示了如何链接where()查询构建器方法以从movies集合中检索符合以下两个条件的文档。 此示例将闭包作为where()查询构建器方法的第一个参数传递,以对逻辑 OR 组进行分组:

  • imdb.rating 值大于 8.5

  • year 值为19861996

$result = DB::connection('mongodb')
->collection('movies')
->where('imdb.rating', '>', 8.5)
->where(function (Builder $query) {
return $query
->where('year', 1986)
->orWhere('year', 1996);
})->get();

本部分中的示例展示了可用于通过以下范围查询和类型检查操作来匹配值的查询构建器语法:

以下示例演示如何使用whereBetween()查询构建器方法从movies集合中检索包含介于99.5之间的imdb.rating值的文档:

$result = DB::connection('mongodb')
->collection('movies')
->whereBetween('imdb.rating', [9, 9.5])
->get();

以下示例演示如何使用whereNull()查询构建器方法从movies集合中检索省略了runtime值或字段的文档:

$result = DB::connection('mongodb')
->collection('movies')
->whereNull('runtime')
->get();

以下示例演示如何使用whereIn()查询构建器方法从movies集合中检索与指定集合中的至少一个title值匹配的文档:

$result = DB::collection('movies')
->whereIn('title', ['Toy Story', 'Shrek 2', 'Johnny English'])
->get();

以下示例演示如何使用whereDate()查询构建器方法从movies集合中检索与released字段中2010-1-15指定日期匹配的文档:

$result = DB::connection('mongodb')
->collection('movies')
->whereDate('released', '2010-1-15')
->get();

以下示例演示如何结合使用like查询运算符和where()查询构建器方法,通过指定的文本模式从movies集合中检索文档。

文本模式可以包含混合有以下通配符的文本:

  • % 匹配零个或多个字符

  • _ 匹配单个字符

$result = DB::collection('movies')
->where('title', 'like', '%spider_man%')
->get();

以下示例演示如何使用distinct()查询构建器方法检索movies集合中文档的year字段的所有不同值。

$result = DB::collection('movies')
->distinct('year')->get();

本节中的示例展示了可用于执行聚合的查询构建器语法。 聚合是根据一组查询结果数据计算值的操作。 您可以使用聚合来计算并返回以下信息:

以下示例演示如何使用groupBy()查询构建器方法检索按runtime字段的共享值分组的文档数据。 此示例链接了以下操作,以匹配movies集合中的文档,这些文档包含Grated值,并为每个不同的runtime值包含一部电影的title字段:

  • 使用where()方法,仅匹配rated字段值为"G"的文档

  • 使用groupBy()方法,按分配了_id字段的runtime字段的不同值对数据进行分组

  • 使用orderBy()方法按runtime字段对群组进行排序

  • 通过在get()方法中指定,返回分组结果中最后一个文档的title数据

提示

groupBy()方法调用 MongoDB $group聚合操作符和$last累加器操作符。 要了解有关这些操作符的更多信息,请参阅 MongoDB Server手册中的 $group(聚合) 。

$result = DB::collection('movies')
->where('rated', 'G')
->groupBy('runtime')
->orderBy('runtime', 'asc')
->get(['title']);

以下示例演示如何使用count()查询构建器方法返回movies集合中包含的文档数:

$result = DB::collection('movies')
->count();

以下示例演示如何使用max()查询构建器方法返回整个movies集合中runtime字段的最大数值:

$result = DB::collection('movies')
->max('runtime');

以下示例演示如何使用min()查询构建器方法返回整个movies集合中year字段的最小数值:

$result = DB::collection('movies')
->min('year');

以下示例演示如何使用avg()查询构建器方法返回整个movies集合中imdb.rating值的数值平均值或算术平均值。

$result = DB::collection('movies')
->avg('imdb.rating');

以下示例演示如何使用sum()查询构建器方法返回整个movies集合中imdb.votes值的数值总计:

$result = DB::collection('movies')
->sum('imdb.votes');

以下示例展示了如何从与查询匹配的结果中聚合数据。 该查询匹配2000年之后的所有电影,并使用avg()方法计算这些匹配项的imdb.rating平均值:

$result = DB::collection('movies')
->where('year', '>', 2000)
->avg('imdb.rating');

本部分包括以下函数的查询构建器示例,这些函数修改查询结果的顺序和格式:

以下示例演示如何使用orderBy()查询构建器方法,以降序排列与title字段中按imdb.rating值指定的筛选器匹配的结果:

$result = DB::collection('movies')
->where('title', 'like', 'back to the future%')
->orderBy('imdb.rating', 'desc')
->get();

以下示例演示如何使用skip()查询构建器方法省略与title字段中指定的筛选器匹配的前四个结果,并按year值升序排序:

$result = DB::collection('movies')
->where('title', 'like', 'star trek%')
->orderBy('year', 'asc')
->skip(4)
->get();

以下示例演示如何使用project()查询构建器方法匹配imdb.rating值大于8.5的文档,并仅返回以下字段值:

  • 电影标题 title

  • cast数组字段的第二个到第四个值(如果存在)

  • 文档_id字段,该字段会自动包含在

$result = DB::collection('movies')
->where('imdb.rating', '>', 8.5)
->project([
'title' => 1,
'cast' => ['$slice' => [1, 3]],
])
->get();

以下示例展示了如何使用paginate()查询构建器方法将整个movie集合划分为15文档的离散结果集。 该示例还包括一个排序顺序,用于按imdb.votes字段以降序排列结果,以及一个仅包括结果中的特定字段的投影。

$resultsPerPage = 15;
$projectionFields = ['title', 'runtime', 'imdb.rating'];
$result = DB::collection('movies')
->orderBy('imdb.votes', 'desc')
->paginate($resultsPerPage, $projectionFields);

要了解有关分页的更多信息,请参阅对 查询生成器结果进行分页 在 Laravel 文档中。

本节包括查询构建器示例,展示如何使用以下 MongoDB 特定的查询操作:

以下示例展示了如何使用exists()查询构建器方法来匹配包含字段random_review的文档:

$result = DB::collection('movies')
->exists('random_review', true);

要了解有关此查询运算符的更多信息,请参阅 MongoDB Server手册中的 $exists 。

以下示例演示如何使用all查询运算符和where()查询构建器方法来匹配包含所有指定字段的文档:

$result = DB::collection('movies')
->where('movies', 'all', ['title', 'rated', 'imdb.rating'])
->get();

要了解有关此查询运算符的更多信息,请参阅 MongoDB Server手册中的 $all 。

以下示例演示如何使用where()查询构建器方法传递size查询运算符,以匹配包含directors字段的文档,而该字段包含恰好包含五个元素的数组:

$result = DB::collection('movies')
->where('directors', 'size', 5)
->get();

要了解有关此查询运算符的更多信息,请参阅 MongoDB Server手册中的 $size 。

以下示例演示如何使用where()查询构建器方法传递type查询运算符,以匹配released字段中包含4类型值(对应于数组数据类型)的文档。

$result = DB::collection('movies')
->where('released', 'type', 4)
->get();

要了解有关类型代码和查询运算符的更多信息,请参阅 MongoDB Server手册中的 $type 。

以下示例展示了如何通过where()查询构建器方法传递mod查询运算符,以使用表达式year % 2 == 0来匹配文档,从而匹配year字段的偶数值:

$result = DB::collection('movies')
->where('year', 'mod', [2, 0])
->get();

要了解有关此查询运算符的更多信息,请参阅 MongoDB Server手册中的 $mod 。

以下示例演示如何使用where()查询构建器方法传递REGEX查询运算符,以匹配包含与指定正则表达式匹配的title字段的文档:

$result = DB::connection('mongodb')
->collection('movies')
->where('title', 'REGEX', new Regex('^the lord of .*', 'i'))
->get();

要了解有关MongoDB 则表达式查询的更多信息,请参阅 MongoDB Server手册中的 $regex 。

以下示例展示了如何使用whereRaw()查询构建器方法来运行使用 MongoDB 查询 API 语法编写的查询操作:

$result = DB::collection('movies')
->whereRaw([
'imdb.votes' => ['$gte' => 1000 ],
'$or' => [
['imdb.rating' => ['$gt' => 7]],
['directors' => ['$in' => [ 'Yasujiro Ozu', 'Sofia Coppola', 'Federico Fellini' ]]],
],
])->get();

以下代码显示了等效的 MongoDB 查询 API 语法:

db.movies.find({
"imdb.votes": { $gte: 1000 },
$or: [{
imdb.rating: { $gt: 7 },
directors: { $in: [ "Yasujiro Ozu", "Sofia Coppola", "Federico Fellini" ] }
}]});

要了解有关MongoDB 查询API 的更多信息,请参阅MongoDB APIMongoDB Server手册中的 查询 。

以下示例演示如何使用where()查询构建器方法传递elemMatch查询运算符,以匹配包含数组元素的文档,而该数组元素与指定查询中的至少一个条件匹配:

$result = DB::collection('movies')
->where('writers', 'elemMatch', ['$in' => ['Maya Forbes', 'Eric Roth']])
->get();

要了解有关 中正则表达式查询的更多信息,请参阅MongoDB MongoDB Server手册中的 $elemMatch 操作符 。

以下示例演示如何使用timeout()方法指定等待游标操作完成的最长持续时间。

$result = DB::collection('movies')
->timeout(2) // value in seconds
->where('year', 2001)
->get();

注意

此设置指定以秒而不是毫秒为单位的maxTimeMS值。 要了解有关maxTimeMS值的更多信息,请参阅 PHP 库文档中的MongoDBCollection::find()

本部分中的示例展示了可用于对 GeoJSON 或坐标对数据执行地理空间查询以检索以下类型的位置的查询构建器语法:

重要

要在 MongoDB 中执行 GeoJSON 查询,必须在集合上创建2d2dsphere索引。 要了解如何创建地理空间索引,请参阅模式生成器指南中的创建地理空间索引部分。

要了解有关GeoJSON 支持的MongoDB 对象的更多信息,请参阅GeoJSON MongoDB Server手册中的 对象 。

以下示例展示了如何使用near查询运算符和where()查询构建器方法来匹配包含与 GeoJSON Point 对象相距不超过50米的位置的文档:

$results = DB::collection('theaters')
->where('location.geo', 'near', [
'$geometry' => [
'type' => 'Point',
'coordinates' => [
-86.6423,
33.6054,
],
],
'$maxDistance' => 50,
])->get();

要了解有关此操作符的更多信息,请参阅 MongoDB Server手册中的 $near 操作符 。

以下示例演示如何使用geoWithin查询运算符和where()查询构建器方法来匹配包含指定Polygon GeoJSON 对象边界内的位置的文档:

$results = DB::collection('theaters')
->where('location.geo', 'geoWithin', [
'$geometry' => [
'type' => 'Polygon',
'coordinates' => [
[
[-72, 40],
[-74, 41],
[-72, 39],
[-72, 40],
],
],
],
])->get();

以下示例演示如何使用geoInstersects查询运算符和where()查询构建器方法来匹配包含与指定LineString GeoJSON 对象相交的位置的文档:

$results = DB::collection('theaters')
->where('location.geo', 'geoIntersects', [
'$geometry' => [
'type' => 'LineString',
'coordinates' => [
[-73.600525, 40.74416],
[-72.600525, 40.74416],
],
],
])->get();

以下示例展示如何使用geoNear聚合操作符和raw()查询构建器方法来执行返回元数据(例如每个匹配项的邻近信息)的聚合:

$results = DB::collection('theaters')->raw(
function (Collection $collection) {
return $collection->aggregate([
[
'$geoNear' => [
'near' => [
'type' => 'Point',
'coordinates' => [-118.34, 34.10],
],
'distanceField' => 'dist.calculated',
'maxDistance' => 500,
'includeLocs' => 'dist.location',
'spherical' => true,
],
],
]);
},
)->toArray();

要了解有关此聚合操作符的更多信息,请参阅 MongoDB Server手册中的 $geoNear 操作符 。

本节包括查询构建器示例,展示如何使用以下特定于 MongoDB 的写入操作:

以下示例演示如何使用update()查询构建器方法和upsert选项更新匹配的文档,或插入包含指定数据的文档(如果不存在)。 当您将upsert选项设置为true且文档不存在时,该命令会同时插入数据以及where()查询操作中指定的title字段和值:

$result = DB::collection('movies')
->where('title', 'Will Hunting')
->update(
[
'plot' => 'An autobiographical movie',
'year' => 1998,
'writers' => [ 'Will Hunting' ],
],
['upsert' => true],
);

update()查询构建器方法会返回该操作更新或插入的文档数。

以下示例演示如何使用increment()查询构建器方法将3000添加到匹配文档中的imdb.votes字段的值:

$result = DB::collection('movies')
->where('title', 'Field of Dreams')
->increment('imdb.votes', 3000);

increment()查询构建器方法会返回该操作更新的文档数。

以下示例演示如何使用decrement()查询构建器方法从匹配文档的imdb.rating字段的值中减去0.2

$result = DB::collection('movies')
->where('title', 'Sharknado')
->decrement('imdb.rating', 0.2);

decrement()查询构建器方法会返回该操作更新的文档数。

以下示例展示了如何使用push()查询构建器方法将"Gary Cole"添加到匹配文档的cast数组字段:

$result = DB::collection('movies')
->where('title', 'Office Space')
->push('cast', 'Gary Cole');

push()查询构建器方法会返回该操作更新的文档数。

以下示例演示如何使用pull()查询构建器方法从查询匹配的文档中的genres字段中删除"Adventure"值:

$result = DB::collection('movies')
->where('title', 'Iron Man')
->pull('genres', 'Adventure');

pull()查询构建器方法会返回该操作更新的文档数。

以下示例演示如何使用unset()查询构建器方法从查询匹配的文档中删除tomatoes.viewer字段和值:

$result = DB::collection('movies')
->where('title', 'Final Accord')
->unset('tomatoes.viewer');

unset()查询构建器方法会返回该操作更新的文档数。

后退

模式构建器

来年

用户身份认证