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. 微信小程序预览时显示有图片未上传

    最近在做小程序项目,在项目里面加了几个图片.在预览调试时出现弹窗显示"文件未上传",但是在左侧的模拟器上却是能正常显示的. 解决思路: 图片在本地和模拟器上显示正常,表示图片本身没 ...

  2. Java中锁的简单使用体验

    锁是控制多个线程访问共享资源的一种同步机制. synchronized:可以将代码块或方法设置为同步. ReentrantLock:提供了比synchronized更广泛的锁操作函数. ReadWri ...

  3. Kettle实例(获取Token并带入请求接口拉取数据到本地)

    背景 近期工作中遇到许多需要协同的表单文档被放到云文档,那么我们本地做数据分析就需要先抽取云文档实时数据到本地数据库,根据接口文档我们需要先获取Token,再将返回值带到接口中发起请求拉取数据,因为在 ...

  4. 你能看到这个汉字么“  ” ?关于Unicode的私人使用区(PUA) 和浏览器端显示处理

    如果你现在使用的是chrome查看那么你是看不到我标题中的汉字的,显示为一个小方框,但是你使用edge查看的话,这个字就能正常的显示出来,不信你试试! 本故事源于我在做数据过程中遇到Unicode编码 ...

  5. C++的编译链接与在vs中build提速

    通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件.在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000) ...

  6. excel的烦恼

    Smiling & Weeping ---- 他未对我好半分,偏巧这感情疯长似野草 题目链接:https://www.matiji.net 思路:与新三进制2思路相似,转化为纯26进制,然后往 ...

  7. 全网最详细Java-JUC

    Java-JUC ⓪基础 ❶进程&线程 进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间. 线程:比进程更小的执行单位,一个进程可以启动多个线程,每条线程并行执行不同的任务 ...

  8. Python基于Flask的高校舆情分析,舆情监控可视化系统

    一.前言在当今社会,舆情监控越来越被重视.随着互联网技术的发展,我们从传统媒体渠道.官方报告.调查问卷等方式搜集到的舆情信息,逐渐被网络上的内容所替代.因为网络上的内容传播速度快.及时性强.覆盖范围广 ...

  9. oj练习题 数字 eval 整数 int ???

    s = input()if 'hello world!' == s.casefold(): print("Yes")else: print("No") A+B问 ...

  10. 从原理到实战,详解XXE攻击

    本文分享自华为云社区<[安全攻防]深入浅出实战系列专题-XXE攻击>,作者: MDKing. 1 基本概念 XML基础:XML 指可扩展标记语言(Extensible Markup Lan ...