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" },

转载于:https://www.cnblogs.com/jayruan/p/7248168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值