聚合管道是由一个或者多个处理文档的阶段组成,每个阶段对输入的文档执行一个操作(例如:可以过滤文档、对文档分组、计算值等),执行操作后的结果会进入到下一个处理阶段;
现在,我们对聚合管道的语法进行了解一下:
db.collection.aggregate(pipeline, options)
其中,
collection:指的是集合或者视图
pipeline:数组类型,是一组数据聚合操作。
其基本语法:[ { <stage> }, ... ];由一组stage组成的数组。
options: 可选,文档类型,其他的一些选项。
下面我们以一个简单的例子来介绍聚合管道的使用:
一、准备工作
初始化商品明细数据
db.goods.insertMany([
{ "_id": 1, name: "盆子", size: "S", quantity: 10, price: 5 },
{ "_id": 2, name: "盆子", size: "M", quantity: 8, price: 8 },
{ "_id": 3, name: "盆子", size: "L", quantity: 5, price: 12 },
{ "_id": 4, name: "杯子", size: "S", quantity: 20, price: 2 },
{ "_id": 5, name: "杯子", size: "M", quantity: 10, price: 5 },
{ "_id": 6, name: "杯子", size: "L", quantity: 10, price: 10 }
])
二、简单使用聚合管道
我们上面了解了聚合管道的语法,下面我们以实际的例子来看一下聚合管理的具体使用。
实例:统计10元以内的不同商品的数量
要完成对不同商品的数量统计,需分成两步:
(1) 查询10元以内的商品
(2) 对商品的数据按照名称进行分组,并对每个分组中的商品数量进行求和。
db.goods.aggregate([
{
$match: { "price": { $lt : 10 } }
},
{
$group: { "_id": "$name", "total": { $sum: "$quantity" } }
}
])
统计的结果如下:
{ "_id" : "盆子", "total" : 18 }
{ "_id" : "杯子", "total" : 30 }
上面的例子我们使用到了$match、$group两个stage,其中:
$match: 用于过滤数据,过滤掉不满足条件的文档。
$group: 对满足条件的文档按照名称进行分组,并按照商品数量进行累加求和。
其中$name, $quantity是聚合表达式
三、聚合表达式
聚合表达式包括文本、字段路径、系统变量、表达式对象、运算符表达式;聚合表达式可以被嵌套。
1、文本
语法:{ $literal: <value> }
value的值将原样返回,即使value是表达式,表达式也会原样返回,不会被执行。
例子:
{ $literal: { $set:{ "comment": "我是新来的" } } } 执行的结果是 { $set:{ "comment": "我是新来的" }
2、字段路径
语法:$ + 字段名称
例子:
使用"$user"指定字段user的路径
使用"$user.name"指定user.name字段的路径
$<field>等效于$$CURRENT.<field>
其中$$CURRENT是一个系统变量默认指向当前对象的根
3、系统变量
语法:$$ + 系统变量
系统变量列表:
NOW:返回当前的日期时间
CLUSTER_TIME:返回当前时间戳
ROOT:指向文档的根
CURRENT:指向字段路径的起始位置,默认是文档的根,但是可以修改
REMOVE:允许通过条件排除字段
DESCEND:$redace表达式允许的结果之一
PRUNE:$redace表达式允许的结果之一
KEEP:$redace表达式允许的结果之一
4、表达式对象
语法:{ <field1>: <expression1>, ... }
其中,
field: 字段
expression: 表达式
5、运算符表达式
语法:{ <operator>: [ <argument1>, <argument2> ... ] }
或 { <operator>: <argument> }
其中,
operator:表达式运算符,此处的表达式运算符比较多,这里就不再介绍,具体可以参考:
MongoDB 数据库操作汇总https://blog.csdn.net/m1729339749/article/details/130086022中的聚合表达式运算符
argument:表达式运算符参数,与表达式运算符相关,不同的表达式运算符会对应不同的参数语法。
四、总结
聚合管道中包含了多个处理文档的阶段,每个阶段处理完文档之后会产生新的文档数据,新产生的文档数据会交给下一个阶段进行处理。
聚合表达式包括文本、字段路径、系统变量、表达式对象、运算符表达式;聚合表达式可以被嵌套。