前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
聚合
SQL 操作/函数 | mongodb聚合操作 |
---|---|
where | $match |
group by | $group |
having | $match |
select | $project |
order by | $sort |
limit | $limit |
sum() | $sum |
count() | $sum |
join | $lookup (v3.2 新增) |
db.collection.aggregate()
是基于数据处理的聚合管道
每个文档通过一个由多个阶段(stage)
组成的管道
可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
以下是有关stage
阶段的概述
$match
过滤文档以仅将符合指定条件的文档传递到下一个管道阶段
{ $match: { <query> } }
$match
获取指定查询条件的文档。查询语法与读操作查询语法相同
$group
按指定的_id
表达式对输入文档进行分组,并为每个不同的分组输出一个文档
_id
每个输出文档的字段都包含唯一的按值分组。输出文档还可以包含保存某些累加器表达式值的计算字段
{
$group:
{
_id: <expression>, // Group By Expression
<field1>: { <accumulator1> : <expression1> },
...
}
}
- | - |
---|---|
_id | *必需的。*如果您指定_id: null 值或任何其他常量值,则该$group 阶段会整体计算所有输入文档的累积值。 请参阅 Group by Null 的示例。 |
field | *可选的。*使用累加器运算符计算 。 |
名称 | 描述 | 类比sql |
---|---|---|
$avg | 计算均值 | avg |
$first | 返回每组第一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的第一个文档。 | limit 0,1 |
$last | 返回每组最后一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的最后个文档。 | - |
$max | 根据分组,获取集合中所有文档对应值得最大值。 | max |
$min | 根据分组,获取集合中所有文档对应值得最小值。 | min |
$push | 将指定的表达式的值添加到一个数组中。 | - |
$addToSet | 将表达式的值添加到一个集合中(无重复值,无序)。 | - |
$sum | 计算总和 | sum |
$stdDevPop | 返回输入值的总体标准偏差(population standard deviation) | - |
$stdDevSamp | 返回输入值的样本标准偏差(the sample standard deviation) | - |
字段路径
聚合表达式使用字段路径来访问输入文档中的字段。要指定字段路径,请在字段名称或 虚线字段名称(如果该字段在嵌入文档中)前加上美元符号$
例如, "$user"
指定字段的字段路径user
或 "$user.name"
指定字段的字段路径"user.name"
db.test.aggregate({
$group:{
_id: null, num: {
$sum:'$age'
},
number: {
$addToSet: '$age'
},
count: {
$sum: 1
}
}
})
$count
3.4版中的新功能。
将包含输入到该阶段的文档数量计数的文档传递到下一个阶段
{ $count: <string> }
- 统计所有name开头为王欣欣,并且不含有num属性的文档数据行有几条
db.test.aggregate([
{
$match: {
name:/^王欣欣/,
num: {$exists:false}
}
},
{
$group: {
_id: null,
count: {$sum: 1}
}
}
])
{ "_id" : null, "count" : 16 }
db.test.aggregate([
{
$match: {
...
}
},
{
$count: "count"
}
])
{ "count" : 16 }
$limit
限制传递到管道中下一阶段的文档数
{ $limit: <positive integer> }
db.test.aggregate({$sort:{_id:1}},{$limit:5})
$skip
跳过进入stage的指定数量的文档,并将其余文档传递到管道中的下一个阶段
{ $skip: <positive integer> }
$sort
对所有输入文档进行排序,并按排序顺序将它们返回到管道
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
区别普通的find,其中
skip
、limit
、sort
是具有优先级的
$sort
只会根据节点安排,依次执行