反电信网络诈骗普法宣传答题实现联表查询学生的平均成绩

news/2024/10/18 10:27:28/

国际经济与贸易学院组织反电信网络诈骗线上答题活动,开展集中普法宣传教育活动,从而构筑立体化反诈骗防线。

通过此次比赛,引导广大同学时刻牢记反诈骗内容,提高师生的自我财产安全防范意识,加强自我网络保护的思想理念,守护好大家的“钱袋子”。

先看一下如何查询,将这两个表连起来的数据是class表中的id和student表中的class_id。

所以我们应该先查出徐老师所在班级的id,是2,然后再查询student表中class_id为2的学生,张二和李二,计算这两个学生的平均成绩。

使用lookup函数实现联表查询:

lookup({from: <要连接的集合名>,localField: <输入记录的要进行相等匹配的字段>,foreignField: <被连接集合的要进行相等匹配的字段>,as: <输出的数组字段名>
})

直接返回学生成绩平均值

如果想要在被连接的表格student做聚合操作,就用pipeline方法。

但是pipeline不能与localField、foreignField共用,所以我们先删掉localField、foreignField再在pipeline中取得学生成绩(score)的平均值

.lookup({from: 'student',pipeline: $.pipeline().group({_id: null,score: $.avg('$score')}).done(),as: 'stu'
})
.match({teacher:"徐老师"
})
.end()

现在打印出来的数据是这样的:

{"list":[{"_id":"5e847ab25eb9428600a512352fa6c7c4","id":2,"teacher":"徐老师","cname":"二班","stu":[{"_id":null,"score":90}]}]
}

但是现在输出的数据有点复杂,如果只想显示teacher和score这两个值,我们再进行下面的操作。

只显示teacher和score这两个值

.lookup({from: 'student',pipeline: $.pipeline().group({  _id: null,score: $.avg('$score')}).done(),as: 'stu'
})
.match({teacher:"徐老师"
})
.replaceRoot({newRoot: $.mergeObjects([$.arrayElemAt(['$stu', 0]), '$$ROOT'])
})
.project({_id:0,teacher:1,score:1
})
.end()

现在打印出来的数据是这样的:

{"list":[{"score":90,"teacher":"徐老师"}]
}

这里看文档的相关解释是:

replaceRoot({ newRoot: <表达式> })是固定写法,将已有字段作为一个新节点输出,我们通常用他来将二级数组变成一级数组。

mergeObjects是累计器操作符,$.arrayElemAt(['$stu', 0]), '$$ROOT’]就是将stu数组中的第一个元素,也就是[{"_id":null,"score":90}]合并到数组的跟节点上面,也就是与teacher、cname这些字段同一级。

project里面将_id后面设为0,将我们想要显示的元素后面设为1,就能控制最后输出的字段。


http://www.ppmy.cn/news/11195.html

相关文章

npm无法使用的坑及其解决

1.&#xff08;如果是第一次可以跳过这个步骤&#xff09;如果你是下载了nodejs的话,那么请以此删除一下的文件:(他们可能有也可能没有&#xff0c;但有的话把它们删除) C:\Program Files (x86)\nodejs C:\Program Files\nodejs C:\Users{User}\AppData\Roaming\npm&#xff08…

一篇文章教会你Linux下《常用操作指令》

基本指令首言ls&#xff08;查看目录&#xff09;pwds&#xff08;显示用户当前所在目录&#xff09;cd&#xff08;改变工作目录&#xff09;mkdir&#xff08;创建目录&#xff09;rmdir&#xff08;删除目录&#xff09;touch &#xff08;新建文件或更新文件时间&#xff0…

2.5(完结)C语言重点解剖内存管理函数要点速记

1.指针如果有具体的指向&#xff0c;包括野指针&#xff0c;对应的合法性&#xff0c;我们是无法验证的。 2.所有的指针如果没有被直接使用&#xff0c;必须设置为NULL。 3.在函数内部&#xff0c;要验证指针的合法性&#xff0c;本质上是验证指针!NULL。 4.自定义函数传入指…

从零开始学习Maven

maven Maven是apache公司开发的基于项目对象模型&#xff08;POM&#xff09; 可以通过一些描述信息来管理项目的构建、报告和文档的软件管理工具。 Maven 是用来管理项目&#xff0c;进行项目构建的一个软件。 java编写 项目构建流程&#xff1a; 1. 导入jar包 2. 配置文…

详解函数指针(●‘◡‘●)☞

本文紧接于http://t.csdn.cn/78wbF 这篇一.函数指针数组\ ( >O< ) /1.书写形式&#xff1a;由函数指针内部*变量名>*变量名[n]&#xff1b; 2.使用&#xff1a;函数指针数组的用途&#xff1a;转移表 例如&#xff1a;模拟计算器&#xff1a;#include<stdio.h> …

Visual studio C++桌面应用程序添加外部文件引用

C桌面应用程序添加外部文件引用 前言 之前对C的开发接触很少&#xff0c;本章节记录一下Visual studio开发C桌面应用程序是如何引入外部文件 ★提高阅读体验★ &#x1f449; ♠一级标题 &#x1f448; &#x1f449; ♥二级标题 &#x1f448; &#x1f449; ♥ 三级标…

【数据结构】队列详解

前言 前面我们学习了一种数据结构&#xff1a;栈&#xff0c;栈是一种只允许在一端尽进行插入删除的数据结构&#xff0c;而今天我们将学习另一种数据结构&#xff1a;队列&#xff0c;队列是一种支持在一端进行插入&#xff0c;在另一端进行删除的数据结构。 一、队列的介绍…

Esp8266学习2. Node-mcu基于Arduino IDE2.0.3设置及基本操作

Esp8266学习2. Node-mcu基于Arduino IDE2.0.3设置及基本操作一、准备工作1. 下载Aruino IDE2. 准备Node-MCU开发板二、设置1. 填写开发板网址2. 开发板设置3. 连接开发板三、测试点亮LED程序1. 加载示例程序2. 编译运行四、一些基本网络操作1. 连接到热点2. 使用WiFiClient3. 创…