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是异步执行的,这就导致我 ...
随机推荐
- decode and CASE
CASE
- Swift_UIButton
1.初始化 /** UIButtonType.system:前面不带图标,默认文字颜色为蓝色,有触摸时的高亮效果 UIButtonType.custom:定制按钮,前面不带图标,默认文字颜色为白色,无 ...
- ubuntu 进入 pycharm(社区版)
先进入到pycharm所在的目录,然后进入bin 然后./pycharm.sh 例如,我把pycharm 放在桌面上 su ➜ xushukui cd '/home/xushukui/桌面/pycha ...
- RobotFramework自动化测试框架系统关键字之断言
一.基础 RobotFramework带有丰富的系统关键,使用时无需导入,直接使用,为写自动化用例带来了极大的方便:不能停留在知道或者是会得程度,只有熟练使用各关键字,才能提升自动化用例的写作效率.下 ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 【二分】【动态规划】Codeforces Round #393 (Div. 1) B. Travel Card
水dp,加个二分就行,自己看代码. B. Travel Card time limit per test 2 seconds memory limit per test 256 megabytes i ...
- 【博弈论】【SG函数】bzoj1457 棋盘游戏
一开始就必胜的特判一下. #include<cstdio> #include<cstring> #include<set> #include<algorith ...
- Exercise02_09
import javax.swing.JOptionPane; public class Acceleration { public static void main(String[] args){ ...
- &#x开头的是什么编码?
在 Node 层利用 cheerio 解析网页时,输出的中文内容都是以 &#x 开头的一堆像乱码一样的东西,尝试过各种编码都无效,而且神奇的是,将这一堆“乱码”保存成网页后,通过浏览器打开又可 ...
- HashMap源码-使用说明部分
/* * Implementation notes. * 使用说明 * * This map usually acts as a binned (bucketed) hash table, but * ...