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"