什么是聚合查询?
在 MongoDB 中,聚合查询是指通过聚合管道(Aggregation Pipeline)对文档进行多个阶段的处理,以获取所需的结果集。聚合管道由多个阶段组成,每个阶段负责对文档进行一些特定的操作,如过滤、分组、排序、计算等等。
聚合查询的好处在于,它可以节省多次查询的时间和资源,以及用一种灵活的方式对数据进行处理和分析。
聚合查询的基本语法
一般来说,聚合查询通过 aggregate
方法实现。具体语法如下:
db.collection.aggregate( [ { $stage1 }, { $stage2 }, ..., { $stageN } ] )
其中,$stage1
到 $stageN
都是聚合管道阶段,它们依次按照给定的顺序进行处理。
聚合查询的常用操作
1. $match:文档过滤
$match
阶段用于对文档进行筛选和过滤,只输出符合条件的文档。具体语法如下:
db.collection.aggregate( [ { $match : { <query> } } ] )
其中,<query>
表示匹配条件,可以是一个文档或一个查询表达式。
例如,我们可以通过以下语句来查询 student 集合中所有年龄大于等于 20 岁的文档:
db.student.aggregate( [ { $match : { age : { $gte : 20 } } } ] )
2. $group:文档分组
$group
阶段用于对文档进行分组,将具有相同字段值的文档分为一组。具体语法如下:
db.collection.aggregate( [ { $group : { _id : <expression>, <field1> : <accumulator1>, ... } } ] )
其中:
_id
表示分组字段,可以是一个常量、表达式或字段名;<field>
表示统计字段,可以是一个字段名或表达式;<accumulator>
表示统计函数,用于对每个分组的文档执行一项统计操作,例如计数、求和等等。
例如,我们可以通过以下语句来查询 student 集合中所有年龄的平均值:
db.student.aggregate( [ { $group : { _id : null, avgAge : { $avg : "$age" } } } ] )
3. $sort:文档排序
$sort
阶段用于对文档进行排序,以得到按照给定顺序排列的结果集。具体语法如下:
db.collection.aggregate( [ { $sort : { <field1> : <sort1>, ... } } ] )
其中:
<field>
表示排序字段,可以是一个字段名或表达式;<sort>
表示排序方向,可以是 1 表示正序,-1 表示倒序。
例如,我们可以通过以下语句来查询 student 集合中所有文档按照年龄从小到大排序:
db.student.aggregate( [ { $sort : { age : 1 } } ] )
4. $project:文档字段映射
$project
阶段用于对文档进行字段映射,可以新增、删除或重命名字段。具体语法如下:
db.collection.aggregate( [ { $project : { <field1> : <expression1>, ... } } ] )
其中:
<field>
表示字段名,可以是一个常量、表达式或字段名;<expression>
表示字段计算表达式,可以是一个算术、逻辑、字符串、日期等等运算。
例如,我们可以通过以下语句来查询 student 集合中所有文档的年龄,以及姓名的第一个字母:
db.student.aggregate( [ { $project : { age : 1, initial : { $substr : [ "$name", 0, 1 ] } } } ] )
总结
以上就是 MongoDB 中聚合查询的基本操作。通过这些操作,我们可以快速、灵活的对文档进行多个阶段的处理,以获取所需的结果集。对于需要对文档进行一些复杂的数据分析和处理的场景来说,聚合查询无疑是一个非常好的选择。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a128f148841e9894d6e51f