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是异步执行的,这就导致我 ...
随机推荐
- 算法-基数排序(radix sort)
本文由@呆代待殆原创,转载请注明出处. 简介:这个排序是原来用在卡片排序机上的一个算法,一般用来比较具有多对关键字域的记录,如日期(年月日),通过基数排序我们会依次对年月日这三个关键字进行排序,只要对 ...
- 浅谈Java中final,finalized,finally
final: final可以让你控制你的成员.方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一. fi ...
- Java中String对象的创建
字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字 ...
- [BZOJ2527]Meteors
整体二分挺好玩的...学一发 这个询问显然是可以二分的,但每次都二分就会T爆,所以我们有了“整体”二分 每次处理一些询问,要求这些询问的答案一定在$[l,r]$中 先把$l$到$mid$的操作实施,那 ...
- [Contest20180321]nonintersect
$\dfrac 2\pi$是个引人注目的数字,先来看看它到底是什么东西 假如有一条直线,它和题目所给的某条长度为$d$的线段夹角为$\theta$,那么线段在直线上的投影长度为$\left|d\cos ...
- 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<=K. #include<cstdio> #include<cs ...
- 【二分图】【最大匹配】【匈牙利算法】bzoj1191 [HNOI2006]超级英雄Hero
裸的最大匹配. #include<cstdio> #include<vector> #include<cstring> using namespace std; v ...
- 找出能被5或6整除,但是不能被两者同时整除的数 Exercise05_11
/** * @author 冰樱梦 * 时间:2018年下半年 * 题目:找出能被5或6整除,但是不能被两者同时整除的数 * */ public class Exercise05_11 { publi ...
- Linux之ps查找进程用kill终止命令
http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html http://blog.csdn.net/andy572633/article ...
- 扩展gridview轻松实现冻结行和列
在实际的项目中,由于项目的需要,数据量比较大,同时显示栏位也比较多,要做gridview里显示完整,并做到用户体验比较好,这就需要冻结表头和关键列.由于用到的地方比较多,我们可以护展一个gridvie ...