Mongo聚合操作

前言

这几年一直在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,其中skiplimitsort是具有优先级的

$sort只会根据节点安排,依次执行

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值