聚合操作aggregate
聚合操作,通过操作一系列的阶段 stage,来对数据进行处理。每个阶段都会对数据进行处理,然后转换给下一阶段,就像「管道」一样
常见的聚合操作 stage 有:
**<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$match</font>**
:用于过滤数据,只让符合条件的文档进入下一个管道阶段。**<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$group</font>**
:根据指定的表达式对输入文档进行分组,可以计算分组内文档的聚合值(如总和、平均值、最大值等)。**<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$sort</font>**
:将输入文档按指定字段排序。**<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$project</font>**
:投影,修改输入文档的结构,可以用来重命名、增加、删除字段或计算新值。**<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$limit</font>**
:限制聚合管道返回的文档数。**<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$skip</font>**
:跳过指定数量的文档,常与<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$limit</font>
一起使用实现分页。- 还有很多其他阶段,如
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$unwind</font>
、<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$lookup</font>
等,用于更复杂的数据处理需求。
$unwind
类似一行转多行
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$unwind</font>
是一个聚合管道阶段的操作符
它的主要作用是从文档的数组字段中取出每个元素,然后为每个元素生成一个新文档,这样做的结果就是将数组拆分成多条独立的记录。这对于处理数组类型的字段并且需要对数组中的每个元素进行单独操作或分析时非常有用。
还可以接受其他参数,来进行行为控制,如
preserveNullAndEmptyArrays 选项可以用来决定是否保留那些数组字段为空或不存在的文档。
$match:
类似 sql 的 where 中的过滤???
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$match</font>
是用来过滤聚合管道(Aggregation Pipeline)中的文档的数据处理阶段。它的主要作用是从输入的文档集合中找出符合指定条件的文档,并将这些文档传递给管道的下一个阶段。
使用<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$match</font>
的优势包括:
- 减少处理的数据量:将
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$match</font>
放在管道的开始,可以尽早过滤掉不需要的文档,从而减少后续管道阶段处理的数据量,提高整体效率。 - 优化性能:尤其是在处理大量数据时,先通过
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$match</font>
筛选可以显著减少资源消耗和提高查询速度。 - 逻辑分组和计算前的预处理:在进行分组(
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$group</font>
)、排序(<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$sort</font>
)或其他操作之前,使用<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$match</font>
来过滤数据,可以使这些操作更加高效。
{ $match: { age: { $gt: 20 } } }
$group:
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$group</font>
是一个聚合管道阶段,用于将集合中的文档分组,根据指定的表达式来聚集文档,然后对每个分组执行各种聚合操作,如计算总和、平均值、最大值、最小值等。
主要用途包括:
- 数据分组:根据一个或多个字段的值将文档划分到不同的组。
- 聚合计算:对每个组执行计算,如求和、平均、最大值、最小值等。
- 聚合数组:将来自同一组的文档的数组字段合并成一个数组。
- 计数:计算每个组的文档数量。
主要参数有:
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">_id</font>
: 这是分组的依据,可以是字段名或者一个表达式。如果指定为null,则所有文档视为一个组。
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">field1</font>
: 自定义输出字段名,表示聚合计算的结果。
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">accumulator</font>
: 聚合运算符,用于定义如何处理分组内的文档,常见的有:
<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$sum</font>
: 计算总和。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$avg</font>
: 计算平均值。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$min</font>
: 找出最小值。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$max</font>
: 找出最大值。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$push</font>
: 将分组内文档的某个字段值放入一个数组中。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$addToSet</font>
: 类似于<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$push</font>
,但会确保数组中的元素不重复。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$first</font>
: 选取每个分组中第一个文档的指定字段值。<font style="color:rgb(51, 51, 51);background-color:rgb(247, 249, 253);">$last</font>
: 选取每个分组中最后一个文档的指定字段值。
{
"_id":"待分组的字段",
"要展示的字段1":{{"$sum":"进行累加的字段"}},
// 计算每个item的总销售额
"totalPrice": { $sum: { $multiply: ["$quantity", "$price"] } }
}
{
"$group":{
_id:{fieldA:"$字段1",fieldB:"$字段2"},
count: { $sum: 1 } // 计算每个组的文档数量
}
}
$sort
用作排序
aggrate([
{$sort:{field1:-1,field:1,fieldDesc:-1,fieldAsc:1}}
])
$lookup
是一个聚合管道阶段,用于将来自一个集合的文档与另一个集合中的文档进行“连接”操作,类似于SQL中的JOIN。这对于处理数据分布在多个集合中的情况非常有用,可以将相关数据组合在一起,便于分析或查询。
{
$lookup:
{
from: <字符串>,
localField: <字符串>,
foreignField: <字符串>,
as: <字符串>
}
}
其他操作
投影
在 find 或 aggrate 语句中,可以添加额外的参数,来控制哪些字段需要返回,哪些字段不需要返回
db.collection.find({},{_name:0,_age:1})
常见逻辑判断
为空判断
$exists、$eq
采购大脑流程
定义数据源
对应了 MongoDB 中的集合 Collection
定义指标配置管理
对应了在 group 中统计的方式,如 sum、max、min 等
只有 7,8 个,对应了 $group 中的展示字段
如计数、时效(平均值/时间)、求和、列表(什么逻辑都没有)、平均值等
需要计算的字段,用占位符代替,在后续的指标中会使用
定义指标分组管理
待梳理
字段管理
对数据源中的 no schema 的文档自动,做一个定义,抽取感兴趣的字段,用于业务使用
有父级字段,即 jsonPath 的方式
分日期、数值、字符串、数组、布尔、对象等
指标管理
基于指标配置,聚合出来的指标
根据不同的业务需求,可以定义不同含义的指标
指标实例管理
最终给用户(技术同学)用的对象,采购大脑查询就是查的这个指标实例
可以定义筛选字段、分组字段、附件字段(即展示字段)