使用mongodb的aggregate解决变态需求
来源:互联网 发布:mysql affected rows 编辑:程序博客网 时间:2024/05/22 00:30
背景
现有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的各种操作命令(尤其是数组的)。好了笔记就记录这些了。
阅读全文
0 0
- 使用mongodb的aggregate解决变态需求
- MongoDB aggregate聚合函数的使用
- MongoDB中聚合(aggregate)的使用
- mongoDB中管道的使用,aggregate
- 使用java 操作mongodb的aggregate
- mongodb的aggregate 用法
- MongoDB的聚合(aggregate)
- 使用aggregate在MongoDB中查找重复的数据记录
- 使用mongodb的aggregate实现获取数组最后一个元素
- Java中使用mongodb的aggregate聚合查询
- MongoDB的聚合函数 Aggregate
- MongoDB的聚合函数 Aggregate
- mongodb的aggregate实例1
- 一条sql语句解决一个变态需求
- MongoDB 学习笔记六 aggregate GROUP使用
- mongodb mapreduce, aggregate, group 的类似功能
- MongoDB aggregate,mapreduce,聚合命令的区别
- mongodb的aggregate学习之1-pipeline
- JS 将秒转为x天x时x分x秒
- [leetcode]: 26. Remove Duplicates from Sorted Array
- Snowflake算法核心
- 添加动态库的四种方式
- 元件更新与替换
- 使用mongodb的aggregate解决变态需求
- 【工具类】-ini配置文件读写操作类
- CDH对应组件版本和maven引入方法
- GUI JDBC 学生信息管理系统
- 如何看待 Kotlin 成为 Android 官方支持开发语言?
- 设计模式-单例模式(Singleton)
- VS2015支持UTF-8 with BOM编码格式处理中文、西班牙文、法文等非英文字符
- 笔记:border-radius兼容写法
- node的dns