查询构建器
在此页面上
- Overview
- 开始之前
- 检索匹配文档
- where 方法示例
- 逻辑条件操作
- 范围和类型检查
- 文本模式匹配示例
- Retrieve Distinct Values
- 聚合(Aggregation)
- 修改查询结果
- 排序结果示例
- 省略指定数量的结果示例
- 在结果示例中显示字段和数组值的子集
- 对结果进行分页示例
- 使用 MongoDB 操作检索数据
- 包含字段示例
- 包含所有字段示例
- 匹配数组大小示例
- 匹配数据类型示例
- 匹配使用模计算的值示例
- 匹配正则表达式
- 运行 MongoDB 查询 API 操作示例
- 匹配数组元素示例
- 指定游标超时示例
- 使用地理空间操作匹配位置
- 邻近位置示例
- 在区域内示例
- 相交几何图形示例
- 附近匹配的邻近数据示例
- 使用 MongoDB 写操作写入数据
- 更新或插入文档示例
- 递增数值示例
- 递减数值示例
- 添加数组元素示例
- 删除数组元素示例
- 删除字段示例
Overview
在本指南中,您可以了解如何使用 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');
本指南提供了以下类型的查询构建器操作的示例:
开始之前
要运行本指南中的代码示例,请完成快速入门教程以配置 Web 应用程序,将示例数据集加载到 MongoDB 部署中,并从控制器方法运行示例代码。 要查看 JSON 文档形式的预期代码输出,请使用快速入门的可选查看 JSON 文档形式的结果步骤中显示的toJson()
方法。
要使用查询构建器执行读取和写入操作,请导入Illuminate\Support\Facades\DB
门面并编写查询。
检索匹配文档
本部分包括以下操作符类别中读取操作的查询构建器示例:
where 方法示例
以下示例演示如何使用where()
查询构建器方法从movies
集合中检索包含imdb.rating
字段值恰好为9.3
的文档。 单击 VIEW OUTPUT按钮查看查询返回的结果:
$result = DB::connection('mongodb') ->collection('movies') ->where('imdb.rating', 9.3) ->get();
逻辑条件操作
本节中的示例显示可用于执行以下逻辑条件操作的查询构建器语法:
逻辑 OR 示例
以下示例展示了如何链接orWhere()
查询构建器方法以从movies
集合中检索与1955
的year
值匹配或与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
的 值和小于year
的1940
值的文档:
$result = DB::connection('mongodb') ->collection('movies') ->where('imdb.rating', '>', 8.5) ->where('year', '<', 1940) ->get();
逻辑 NOT 示例
以下示例演示如何调用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
值为1986
或1996
$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
集合中检索包含介于9
和9.5
之间的imdb.rating
值的文档:
$result = DB::connection('mongodb') ->collection('movies') ->whereBetween('imdb.rating', [9, 9.5]) ->get();
Null 或缺失值示例
以下示例演示如何使用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();
Retrieve Distinct Values
以下示例演示如何使用distinct()
查询构建器方法检索movies
集合中文档的year
字段的所有不同值。
$result = DB::collection('movies') ->distinct('year')->get();
聚合(Aggregation)
本节中的示例展示了可用于执行聚合的查询构建器语法。 聚合是根据一组查询结果数据计算值的操作。 您可以使用聚合来计算并返回以下信息:
按通用字段值分组的结果示例
以下示例演示如何使用groupBy()
查询构建器方法检索按runtime
字段的共享值分组的文档数据。 此示例链接了以下操作,以匹配movies
集合中的文档,这些文档包含G
的rated
值,并为每个不同的runtime
值包含一部电影的title
字段:
使用
where()
方法,仅匹配rated
字段值为"G"
的文档使用
groupBy()
方法,按分配了_id
字段的runtime
字段的不同值对数据进行分组使用
orderBy()
方法按runtime
字段对群组进行排序通过在
get()
方法中指定,返回分组结果中最后一个文档的title
数据
提示
$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 操作检索数据
本节包括查询构建器示例,展示如何使用以下 MongoDB 特定的查询操作:
包含字段示例
以下示例展示了如何使用exists()
查询构建器方法来匹配包含字段random_review
的文档:
$result = DB::collection('movies') ->exists('random_review', true);
包含所有字段示例
以下示例演示如何使用all
查询运算符和where()
查询构建器方法来匹配包含所有指定字段的文档:
$result = DB::collection('movies') ->where('movies', 'all', ['title', 'rated', 'imdb.rating']) ->get();
匹配数组大小示例
以下示例演示如何使用where()
查询构建器方法传递size
查询运算符,以匹配包含directors
字段的文档,而该字段包含恰好包含五个元素的数组:
$result = DB::collection('movies') ->where('directors', 'size', 5) ->get();
匹配数据类型示例
以下示例演示如何使用where()
查询构建器方法传递type
查询运算符,以匹配released
字段中包含4
类型值(对应于数组数据类型)的文档。
$result = DB::collection('movies') ->where('released', 'type', 4) ->get();
匹配使用模计算的值示例
以下示例展示了如何通过where()
查询构建器方法传递mod
查询运算符,以使用表达式year % 2 == 0
来匹配文档,从而匹配year
字段的偶数值:
$result = DB::collection('movies') ->where('year', 'mod', [2, 0]) ->get();
匹配正则表达式
以下示例演示如何使用where()
查询构建器方法传递REGEX
查询运算符,以匹配包含与指定正则表达式匹配的title
字段的文档:
$result = DB::connection('mongodb') ->collection('movies') ->where('title', 'REGEX', new Regex('^the lord of .*', 'i')) ->get();
运行 MongoDB 查询 API 操作示例
以下示例展示了如何使用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 查询,必须在集合上创建2d
或2dsphere
索引。 要了解如何创建地理空间索引,请参阅模式生成器指南中的创建地理空间索引部分。
要了解有关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();
在区域内示例
以下示例演示如何使用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 写操作写入数据
本节包括查询构建器示例,展示如何使用以下特定于 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()
查询构建器方法会返回该操作更新的文档数。