mongo aggregate
https://cnodejs.org/topic/59264f62855efbac2cf7a2f3
背景 现有1000条学生记录,结构如下:
{
name:String,//名称
clazz:{type:ObjectId,ref:"classes"},//班级id
status:Number,//状态 1在校 2离校
marks:[Number],//标记 1迟到 2早退 3请假
age:Number//年龄
}
需求 要求统计1000个学生的所在班级列表,列表内容如下(模拟数据,不要在意统计的合理不合理): 班级名称 | 在校人数 | 离校人数 | 没有迟到标记的在校人数 | 没有迟到标记的在校学生的平均年龄
实现代码:
db.getCollection('students').aggregate([{
$group: {//班级分组拿到班级id和班级内的学员信息
_id: "$clazz",
stus: {
$push: "$$ROOT"
}
}
}, {
$project: {
_id: 1,
stus: 1,
out_num: {//计算离校人员数量
$size: {
$filter: {
input: "$stus",
as: "stu",
cond: { $eq: ["$$stu.status", 2] }
}
}
},
in_num: {//计算在校人员数量
$size: {
$filter: {
input: "$stus",
as: "stu",
cond: { $eq: ["$$stu.status", 1] }
}
}
},
in_no_1: {//计算 在校并且没有迟到标记的学员列表
$filter: {
input: "$stus",
as: "stu",
cond: { $and: [{ $eq: ["$$stu.status", 1] }, { $eq: [{ $indexOfArray: ["$$stu.marks", 1] }, -1] }] }
}
},
}
}, {
$project: {
_id: 1,
out_num: 1,
in_num: 1,
in_no_1: 1,
in_nu_1_num: { $size: "$in_no_1" },//计算在校并且没有迟到标记的学员数量
avg: {//计算在校并且没有迟到标记的学员的平均年龄
$cond: {
if: { $eq: [{ $size: "$in_no_1" }, 0] },//如果班级内没有符合条件的学生则年龄记为0
then: 0,
else: {//班级内有符合条件的学生,计算学生年龄总和并除以学生数量
$divide: [{
$reduce: {
input: "$in_no_1",
initialValue: 0,
in : { $add: ['$$value', "$$this.age"] }
}
}, {
$size: "$in_no_1"
}]
}
}
}
}
}, {
$lookup: {//关联查询班级信息,关联信息返回为数组
from: "classes",
localField: "_id",
foreignField: "_id",
as: "clazz"
}
}, {
$unwind: '$clazz'//拆分班级返回信息数组
}, {
$project: {//整理最后的数据
_id: 1,
out_num: 1,
in_num: 1,
avg: 1,
in_nu_1_num: 1,
name: '$clazz.name'
}
}])
代码就这些,需要看的是aggregate的各种操作命令(尤其是数组的)。好了笔记就记录这些了。有更好的解决方案,大家一起讨论。
mongo aggregate的更多相关文章
- mongo aggregate 用法记录
mongo 聚合查询查询还是很方便的,做下记录 依赖的jar是org.springframework.data.mongodb 1.9.6 低版本可能不支持. 数据结构 大概是 这是一份 ...
- mongo aggregate 删除重复数据
$group 按照什么排序, 关照 _id 这个是排序的依据 $match 这个从排序的结果内抽取 count 大于一的 allDiskUse 如果内存配置比较小, 设置这个才能运行, 否则会崩. ...
- mongodb聚合内存不足解决方案
原因:mongodb每一个文档默认只有16M.聚合的结果是一个BSON文档,当超过16M大小时,就会报内存不够错误. exceeded memory limit for $group.but didn ...
- Mongo集合操作Aggregate
最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得.. 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一 ...
- 学习mongo系列(七)aggregate() ,$group() 管道
aggregate()聚合,主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 接上边的数据库: > db.user.aggregate ...
- MongoDB分组汇总操作,及Spring data mongo的实现
转载请在页首注明作者与出处 一:分组汇总 1.1:SQL样例 分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的 ),class from score g ...
- Mongo DB 2.6 需要知道的一些自身限定
在现实的世界中,任何事情都有两面性,在程序的世界中,亦然! 我们不论是在使用一门新的语言,还是一门新的技术,在了解它有多么的让人兴奋,让人轻松,多么的优秀之余,还是很有必要了解一些他的局限性,方便你在 ...
- mongo group by
mongo的写法与mysql等sql有着天壤之别,如最近在统计爬虫抓取的数据,其中一个就是按字段从大到小取前十个: sql写法:select count(id) from invest group b ...
- 使用aggregate在MongoDB中查找重复的数据记录
我们知道,MongoDB属于文档型数据库,其存储的文档类型都是JSON对象.正是由于这一特性,我们在Node.js中会经常使用MongoDB进行数据的存取.但由于Node.js是异步执行的,这就导致我 ...
随机推荐
- CentOS7部署l2tp/IPsec服务
1.安装必要的工具 yum install vim net-tools wget unzip -y 2. 下载安装脚本 wget -O StackScript.zip http://files.cnb ...
- Oracle like 里面的通配符 以及regexp_like
关于like后面的条件,Oracle提供了四种匹配模式: 1,% :表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FR ...
- [CF235E]Number Challenge
$\newcommand{fl}[1]{\left\lfloor#1\right\rfloor}$题意:求$\sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\lim ...
- 【贪心】bzoj3721 PA2014 Final Bazarek
考虑不限制奇偶的情况,那就是直接排序取前k个的和. 加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数 ...
- Cmder | 一款命令行增强工具
文章目录 什么是cmder 安装cmder 让cmder便于使用 将cmder添加到右键菜单中 在设置中添加语言环境 设置默认使用cmd.PowerShell还是bash 调节背景的透明度 添加 ll ...
- 每天一个linux命令13之curl发送http请求
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...
- IOS之Block的应用-textFeild的回调应用
Block的一点优点为可以省略回调函数,简化代码今天我就应用了以下. 以下是代码片段. _testTextField1=[[MyTextField alloc] init]; [self.view a ...
- Android Studio 生成aar包,并非debug包,而是release包
1.编写Module,作为library 下面是需要发布的aar包,上面的是随意的project 2.app依赖myLibrary 2.1 设置Project Structure 2.2 app依赖M ...
- ios-真机调试出错信息
更新证书错误Code Sign error: Provisioning profile ‘XXXX'can't be found 在Xcode中当你在更新了你得证书 ...
- SQL注入之导出WebShell
已经听N个人过说有人已经发现SQL注入Access得到webshell的技术了,也只是听说而已,具体的细节还是不得而知. 最近在看的书中一章提到Jet的安全,然后灵光一闪,呵呵,发现了一种可以利用ac ...