MongoDB快速入门教程 (3.3)
3.4.聚合
3.4.1.什么是聚合?
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)

例如上图中一个集合中有9个文档,通过count操作后,输出一个9,这种操作就是一个单一的聚合操作
3.4.2.什么是聚合管道?
上面说到了单一的聚合操作,那什么又是聚合管道呢?你可以把管道理解为流水线,或者就是水管,把数据看作是水流,我们称之为数据流,管道中装的都是数据,数据在管道中流动,数据在一个管道中经过处理后可以传递到下一个管道,最终得到你想要的数据
请看官网例子:

在集合中有4条文档数据,经过$match操作后可以匹配出status为A的数据,此时处理后的数据只剩3条,status为D的这条数据被过滤掉了,紧接着,数据进入下一个管道,此时交给$group来处理,$group的作用是对文档进行分组,分组后又根据amount字段求和,所以id为A123的最终结果是750(500+250)
3.4.3.如何使用聚合管道操作
1.aggregate() 方法
这个方法就是用来具体执行管道操作的,具体语法如下:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
官网例子:
db.orders.aggregate([
{$match: {status: "A"}},
{$group: {_id: "$cust_id", total: {$sum: "$amount"}}}
])
aggregate方法中传入一个数组,这个数据中的每个元素就是一次聚合操作,第一个元素的操作执行完后会传递给下个元素执行,每个元素都是一个对象,对象中的key就是管道操作符,例如:{$match: {status: "A"}},这里面的$match就是管道操作符,对象中的value值就是管道表达式,例如:{$match: {status: "A"}},这里面的{status: "A"}就是管道表达式
2.常用管道操作符

3.管道表达式
前面我们已经说过什么是管道表达式,例如:{_id: "$cust_id", total: {$sum: "$amount"}},每一个管道表达式都是对象的形式,里面也包含了key和value,key通常都是字段名,value就是字段值, 字段值里面可以是由表达式操作符组成的对象,例如:{$sum: "$amount"},这个对象就是由表达式操作符组成的,其中,$sum就是一个表达式操作符,用于求和运算
常见的表达式操作符如下:

4.实际操作
准备数据,你可以将下列代码直接拷贝到mongodb中执行:
db.order.insert({"order_id":"1","uid":10001,"trade_no":"nd001","all_price":10,"all_num":9})
db.order.insert({"order_id":"2","uid":10002,"trade_no":"nd002","all_price":20,"all_num":8})
db.order.insert({"order_id":"3","uid":10003,"trade_no":"nd003","all_price":30,"all_num":7})
db.order_item.insert({"order_id":"1","title":"无线鼠标 1","price":500,num:10})
db.order_item.insert({"order_id":"1","title":"无线键盘 2","price":600,num:11})
db.order_item.insert({"order_id":"1","title":"有线键盘 3","price":700,num:12})
db.order_item.insert({"order_id":"2","title":"苹果","price":50,num:2})
db.order_item.insert({"order_id":"2","title":"香蕉","price":40,num:3})
db.order_item.insert({"order_id":"3","title":"牛奶","price":20,num:9})
db.order_item.insert({"order_id":"3","title":"面包","price":10,num:4})

1.$project
通俗的说这个管道操作符可以用来筛选指定的字段
举例:查询出订单信息,只显示订单号
db.order.aggregate([{$project:{_id: 0, order_id: 1}}])
2.$match
通俗的说$match操作的作用就是查找满足条件的数据
db.order.aggregate([{$project: {order_id: 1, all_price: 1}}, {$match: {"all_price": {$gt: 20}}}])
3.$group
$group主要是用来进行分组操作的
db.order_item.aggregate([{$group: {_id: "$order_id", total: {$sum: "$num"}}}])
注意:在使用$group的时候必须有一个_id作为分组的条件
4.$sort
$sort的作用是用来进行排序
db.order_item.aggregate([{$sort: {"price": -1}}])
注意: -1 表示降序, 1表示升序
5.$limit
$limit的作用是限制显示条数
db.order_item.aggregate([{$sort: {"price": -1}}, {$limit: 1}])
6.$skip
$skip的作用是可以跳过的条数
db.order_item.aggregate([{$sort: {"price": -1}}, {$skip: 3}])
7.$lookup
$lookup用来做关联查询,举个例子:查询order表中,order_id对应的商品信息
db.order.aggregate([{$lookup:{from: "order_item", localField: "order_id", foreignField: "order_id"
螺钉课堂视频课程地址:http://edu.nodeing.com
MongoDB快速入门教程 (3.3)的更多相关文章
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- MongoDB快速入门教程 (3.2)
3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条 ...
- MongoDB快速入门教程 (4.4)
4.5.Mongoose索引和方法 4.5.1.设置索引 let UserSchema = mongoose.Schema({ sn: { type: Number, // 设置唯一索引 unique ...
- MongoDB快速入门教程 (4.3)
4.3.Mongoose模块化 4.3.1.为什么要进行模块化拆分? 模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程.订单.分类.教师等多 ...
- MongoDB快速入门教程 (4.2)
4.2.Mongoose实现增删查改 中文文档地址: https://cn.mongoosedoc.top/docs/guide.html 4.2.1.Mongoose是什么? Mongoose是Mo ...
- MongoDB快速入门教程 (4.1)
4.Mongoose使用 4.1.nodejs操作mongodb 文档地址:http://mongodb.github.io/node-mongodb-native/3.2/tutorials/cru ...
- MongoDB快速入门教程(3.1)
3.MongoDB进阶 3.1.权限验证 以下内容适用于Mac系统用户,window系统用户请看后面文档 3.1.1.创建超级管理员用户 默认情况下连接mongodb是不需要用户名和密码的,这样不安全 ...
- MongoDB快速入门教程 (2)
2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...
- MongoDB快速入门教程 (1)
1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...
随机推荐
- Scala - 语言专家 - Desugar Scala code
https://mp.weixin.qq.com/s/zwrG1MfUzXwtik7jotpQsA 介绍Intellij IDEA中的一个去除Scala语法糖的功能. 1. 去除 ...
- 洞悉MySQL底层架构:游走在缓冲与磁盘之间
提起MySQL,其实网上已经有一大把教程了,为什么我还要写这篇文章呢,大概是因为网上很多网站都是比较零散,而且描述不够直观,不能系统对MySQL相关知识有一个系统的学习,导致不能形成知识体系.为此我撰 ...
- 金融SaaS平台之构思篇
背景介绍 从事过金融服务行业的同学们都知道,业务系统是非常之多的,核心的就有估值.交易.TA.资讯系统,其他类似产品生命周期系统.投后分析系统等待,而且各个业务系统的逻辑非常之复杂,所以一般金融机构都 ...
- Java实现 洛谷 P1060 开心的金明
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...
- Java实现 LeetCode 739 每日温度(暴力循环)
739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temper ...
- Java实现 LeetCode 257 二叉树的所有路径
257. 二叉树的所有路径 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \ 2 3 \ 5 输出: ["1->2 ...
- Java实现 蓝桥杯VIP 算法提高 我们的征途是星辰大海
算法提高 我们的征途是星辰大海 时间限制:1.0s 内存限制:256.0MB 最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成. 共有四种方格: '.' 代表空地,c ...
- java矩形的关系
在编写图形界面软件的时候,经常会遇到处理两个矩形的关系. 如图[1.jpg]所示,矩形的交集指的是:两个矩形重叠区的矩形,当然也可能不存在(参看[2.jpg]). 两个矩形的并集指的是:能包含这两个矩 ...
- java实现纵横火柴棋
[编程题] 这是一个纵横火柴棒游戏.如图[1.jpg],在一个3x4的方格中,游戏的双方轮流放置火柴棒.其规则是: 1. 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 2. 火柴棒的方向只能 ...
- java实现第二届蓝桥杯异或加密法
异或加密法. 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算. 解密的方法就是再执行一次同样的操作. 加密过程中n位二进制数会循环使用.并且其长度也可能不是8的整数倍. ...