1,聚合

聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()。

常用的表达式如上图。

1.1,aggregate  语法

语法:     db.集合名称.aggregate([{管道:{表达式}}])

常用的管道:

1.2,$match 和 $group

往集合 items 中先插入数据

db.items.insert(
[
{quantity:2,price:5.0,pnumber:"p003"},
{quantity:2,price:8.0,pnumber:"p002"},
{quantity:1,price:4.0,pnumber:"p002"},
{quantity:2,price:4.0,pnumber:"p001"},
{quantity:4,price:10.0,pnumber:"p003"},
{quantity:10,price:20.0,pnumber:"p001"},
{quantity:10,price:20.0,pnumber:"p003"},
{quantity:5,price:10.0,pnumber:"p002"}
]
)

查看可视化工具插入的结果如下:

例1:

查询 pnumber:"p001" , 再来看语法 :db.集合名称.aggregate([{管道:{表达式}}])

db.items.aggregate([{"$match":{"pnumber":"p001"}}])

例2:

查询price 大于8的 quantity ,以平均值 avg_quantity表示,并按 pnumber分组。所以分组字段是 $pnumber,平均值avg_quantity,avg_quantity是新的字段名,聚合操作符是 $avg。

db.items.aggregate([
{"$match":{"price":{"$gt":8}}},
{"$group":{"_id":"$pnumber","avg_quantity":{"$avg":"$quantity"}}}
])

例3:

查询 price大于8的quantity,以平均值 avg_quantity 表示,并过滤出平均值大于5的avg_quantity。前半句话是上个例子的,过滤出 是用 $match。

db.items.aggregate([
{"$match":{"price":{"$gt":8}}},
{"$group":{"_id":"$pnumber","avg_quantity":{"$avg":"$quantity"}}},
{"$match":{"avg_quantity":{"$gt":5}}}
])

例4:

按 pnumber分组

db.items.aggregate([
{"$group":{"_id":"$pnumber"}}
])

按 quantity 和 price 分组

db.items.aggregate([
{"$group":{"_id":{"quantity":"$quantity","price":"$price"}}}
])

截了部分屏

1.3,聚合操作符($sum,$avg,$max,$min,$first,$last)

例1($max):

按 pnumber 分组,并求出 每组 price的最大值max_price

db.items.aggregate([
{"$group":
{"_id":"$pnumber",
"max_price":{"$max":"$price"}
}
}
])

例2($min):

按 pnumber分组,并求出每组 price 的最大值 max_price,最小值 min_price

db.items.aggregate([
{"$group":
{"_id":"$pnumber",
"max_price":{"$max":"$price"},
"min_price":{"$min":"$price"}
}
}
])

这个把上面写的 $max,$min一替换就行。

例3($sum):

按pnumber分组,并计算每组的 quantity的总和 count,并按count升序排。这里用了 $sort,注意要在分组完才能 $sort(看好格式)。

db.items.aggregate([
{"$group":
{"_id":"$pnumber","count":{"$sum":"$quantity"}},
},
{"$sort":{"count": 1}}
])

例4:

查询分组后 每个 pnumber 出现的次数,并按升序排

db.items.aggregate([
{"$group":
{"_id":"$pnumber","count":{"$sum":1}},
},
{"$sort":{"count": 1}}
])

例5($addToSet,$push):

按 pnumber 分组,并查出各 pnumber内的price ,price可以重复 (用 $push)

db.items.aggregate([
{"$group":
{"_id":"$pnumber","prices":{"$push":"$price"}}
}
])

结果 是因为添加的数据不太好,所以看不出有没有重复还是重复了。

按 pnumber 分组,并查出各 pnumber内的price ,price不可以重复 (用 $addToSet)

db.items.aggregate([
{"$group":
{"_id":"$pnumber","prices":{"$addToSet":"$price"}}
}
])

1.4,投射 ($project),$add

只保留 _id 和 pnumber,新增 new_price,new_price 就是让 price加1(用到了 $add)

db.items.aggregate([
{
$project:{
"_id":1,
"pnumber":1,
"new_price":{"$add":["$price", 1]}
}
}
])

1.5,排序($sort),限制($limit),跳过($skip)

例1:

取平均价格最贵的前两个pnumber,所以是按pnumber分组($group),再降序排($sort),再限制是前两个($limit)。

db.items.aggregate([
{
"$group":{"_id":"$pnumber","平均价格":{"$avg":"$price"}}
},
{
"$sort":{"平均价格": -1}
},
{
"$limit": 2
}
])

例2:

取平均价格最贵的第二个 pnumber,就是在上个例子的基础上,跳过1个, $skip:1

db.items.aggregate([
{
"$group":{"_id":"$pnumber","平均价格":{"$avg":"$price"}}
},
{
"$sort":{"平均价格": -1}
},
{
"$limit": 2
},
{
"$skip":1
}
])

1.6,随机获取,$sample

db.items.aggregate([
{$sample: {size: 3}}
])

再点运行,就出来不一样的结果

1.7,截取($substr),拼接($concat),转小写($toLower),转大写($toUpper)

例1:

把 pnumber 的下标为 0到2 位置的 截出来,_id 隐藏

db.items.aggregate([
{
$project:{
"_id":0,
"str": {$substr: ["$pnumber", 0, 2]}
}
} ])

因为截取是 左闭右开的截,所以显示是两个字符。

例2:

把 pnumber 字段下的内容 和 "测试" 拼接起来

db.items.aggregate([
{
"$project":{
"_id":0,
"str": {"$concat": ["$pnumber", "测试"]}
}
}
])

例3:

将pnumber的 英文转换为大写

db.items.aggregate([
{
"$project":{"pnumber":{"$toUpper":"$pnumber"}}
}
])

MongoDB的聚合笔记的更多相关文章

  1. Mongodb Manual阅读笔记:CH6 聚合

    6 聚合 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  2. Mongodb Manual阅读笔记:CH9 Sharding

    9.分片(Sharding) Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb ...

  3. Mongodb Manual阅读笔记:CH8 复制集

    8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  4. Mongodb Manual阅读笔记:CH7 索引

    7索引 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔记 ...

  5. Mongodb Manual阅读笔记:CH5 安全性

    5 安全性 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读 ...

  6. Mongodb Manual阅读笔记:CH4 管理

    4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  7. Mongodb Manual阅读笔记:CH3 数据模型(Data Models)

    3数据模型(Data Models) Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mon ...

  8. Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作

    2 Mongodb CRUD 操作 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mong ...

  9. MongoDB入门---聚合操作&管道操作符&索引的使用

    经过前段时间的学习呢,我们对MongoDB有了一个大概的了解,接下来就要开始使用稍稍深入一点的东西了,首先呢,就是MongoDB中的聚合函数,跟mysql中的count等函数差不多.话不多说哈,我们先 ...

  10. 【翻译】MongoDB指南/聚合——聚合管道

    [原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...

随机推荐

  1. 三维模型OSGB格式轻量化纹理压缩关键技术分析

    三维模型OSGB格式轻量化纹理压缩关键技术分析 在三维模型应用中,纹理是一个十分重要的因素,可以使得模型更加真实.精细.随着移动设备和网络传输速度的限制,纹理数据也需要进行轻量化处理,而OSGB格式纹 ...

  2. Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  3. 文盘Rust -- 生命周期问题引发的 static hashmap 锁

    2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...

  4. 好好回答下 TCP 和 UDP 的区别!

    写了这么多篇关于 TCP 和 UDP 的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈. 关于 TCP 和 UDP ,想必大家都看过一张这样的图. 有一个小姑娘在对着瓶口慢慢的 ...

  5. 《Python魔法大冒险》003 两个神奇的魔法工具

    魔法师:小鱼,要开始编写魔法般的Python程序,我们首先需要两个神奇的工具:Python解释器和代码编辑器. 小鱼:这两个工具是做什么的? 魔法师:你可以把Python解释器看作是一个魔法棒,只要你 ...

  6. 大企业才用的分布式唯一Id,它比GUID好

    支持.Net Core(2.0及以上)与.Net Framework(4.5及以上) 可以部署在Docker, Windows, Linux, Mac. 分布式唯一Id,顾名思义,是指在全世界任何一台 ...

  7. 各快 100 倍?4G、5G、6G 相差这么多吗

    二狗子今天晚上有点 emo,为什么呢? 原来是二狗子心心念很久的一个手游上线了,二狗子兴冲冲地下载了 40 多分钟,终于下载完了游戏.结果打开游戏一看,发现游戏内部的更新写着预计 30 分钟完成更新. ...

  8. Python基础合集

    入门介绍 01.python由来与发展介绍 02.WEB项目开发流程 第一篇 markdown编辑器 01.markdown基本语法 02.Typora简介与安装 03.Windows上gitee+T ...

  9. Apifox调用文件下载或Excel导出接口

    点发送下面这个发送并下载就行了,,,,,在网上搜了一下午愣是没看到,,,,,,

  10. 《数据结构》王卓老师 p48-p62学习反馈

    跟着青岛大学-王卓老师的视频进行到链队列时,运行链队列代码的时候遇到了两个问题: 1.)Program received signal SIGSEGV Segmentation fault 附代码: ...