云开发联表数据查询教程:微信开发者工具中实现学生平均成绩计算

2025-02-17
来源:网络整理

在上一篇文章中,我们介绍了如何使用“库存”来了解云开发数据库交易,并告诉如何将字段提取到云开发数据库重建中的单独集中;今天,我们将了解云开发联合表数据查询,并教您如何将其应用于云功能,并在微信开发人员工具中打印出我们的查询结果。

让我们首先设置场景。现在有两个桌子。让我们检查一下Xu老师教授的所有学生的平均分数:

1。关节桌查询

让我们首先看一下如何查询。连接这两个表的数据是表和表中的ID。

因此,我们应该首先找出Xu老师所在的班级ID,即2岁,然后在桌子上抬起2个学生, er和li er,并计算这两个学生的平均得分。

让我们看一下如何在云开发中实现这样的连词表查询。在“云开发文档”中,在开发指南数据库中,有一个连词表查询的介绍。我们使用函数来实现连词表查询:

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

(1)加入两张桌子

应用于我们上面设置的场景,就像以下内容一样,您需要调用结尾方法以标记最终定义:

lookup({ from: 'student', //要关联的表student localField: 'id', //class表中的关联字段 foreignField: 'class_id', //student表中关联字段 as: 'stu' //定义输出数组的别名}).end()

该声明将找到以下结果,并将找到班级的信息以及与班级相对应的所有学生的信息:

{"list": [{ "id":1, "teacher":"王老师", "cname":"一班", "stu":[ { "sname":"宁一", "class_id":1, "score":90 } ] }, { "id":2, "teacher":"徐老师", "cname":"二班", "stu":[ { "class_id":2, "sname":"张二", "score":100 }, { "class_id":2, "sname":"李二", "score":80 } ] }]}

但是,我们只需要Xu老师所在的班级学生的数据,因此我们需要添加一个条件,而不能直接遵循,而是。让我们改进以下代码。

(2)用于执行有条件查询

.lookup({ from: 'student', localField: 'id', foreignField: 'class_id', as: 'stu'}).match({ teacher:"徐老师"}).end()

现在,我们只返回Xu班级班的学生数据。学生数据位于STU的相应数组中:


{"list": [ {"_id":"5e847ab25eb9428600a512352fa6c7c4", "id":2, "teacher":"徐老师", "cname":"二班", //学生数据 "stu":[ {"_id":"37e26adb5eb945a70084351e57f6d717", "class_id":2, "sname":"张二", "score":100 }, {"_id":"5e847ab25eb945cf00a5884204297ed8", "class_id":2, "sname":"李二", "score":80 } ] } ]}

接下来,我们将继续优化代码,并直接返回学生的平均分数。

数组数据如何存入数据库_数组在数据库中如何存储_小程序云开发数据库表中数组

(3)直接返回普通学生的成绩

如果要在连接的表中(在本课程中)进行聚合操作,请使用该方法。

但是,它不能与之共享或与之共享,因此我们首先将其删除,然后获得学生分数的平均值()in:

.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 } ] } ]}

但是现在的输出数据有点复杂。如果您只想显示这两个值的总和,我们将执行以下操作。

(4)仅显示两个值

.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":"徐老师"} ]}

({:})是一种固定的写作方法,它将现有字段作为新节点输出。我们通常使用它将二级数组变成一级阵列。

它是累加器运算符,$。(['$ stu',0]),'$$ root']是转换stu数组中的第一个元素,即[{{“ _id”:null':null,“”:: 90}]将其合并到阵列的节点上,即,字段与和和和和和和和和和和和和和和和所在所为所为作用为同一所值所为作用为同一所值所为作用为所带。

将_id设置为0,我们要显示为1的元素以控制最后的输出字段。

2。在云功能中应用

接下来,让我们看一下如何在云功能中使用它,并在微信开发人员工具中打印出上面的查询结果。

(1)在云数据库中添加数据

我们在微信开发人员工具中打开云开发控制台,然后在云数据库中首先创建这两个表。让我们以创建桌子为例。

创建表之后,我们在表中添加记录,并根据上表中的数据添加它们。以下是第2类的数据。

小程序云开发数据库表中数组_数组在数据库中如何存储_数组数据如何存入数据库

添加了所有数据后,我们转到了微信开发人员工具云功能文件夹,以创建一个名为Test的云功能云开发项目。我们提前创建了它。如果您不知道如何创建它,则可以看到我以前发布的内容。创建和启动云开发迷你程序的30分钟课程,它教您如何创建它们。

(2)创建云功能并初始化数据库

创建完成后,系统将帮助我们创建一个测试文件夹。我们打开test/.js文件,删除一些默认代码,然后像以下内容初始化数据库:

// 云函数入口文件const cloud = require('wx-server-sdk')cloud.init()//初始化数据库const db = cloud.database()const _ = db.commandconst $ = _.aggregate
// 云函数入口函数exports.main = async (event, context) => { //下面继续在这里面添加代码}

(3)编辑云功能输入功能

// 云函数入口函数exports.main = async (event, context) => { return await db.collection('class').aggregate() .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()}

编辑后,保存文件并上传和部署云功能。

(4)上传和部署云功能

右键单击云功能,选择上传和部署:云安装依赖项(未上传)

打开云开发控制台 - 单击云功能 - 找到测试云功能,然后单击云测试:

在弹出的测试框中,直接单击“运行测试”按钮

返回的结果将在下面打印,表明连词表查询已成功完成!

还有一个

数据库实时广播的第三届会议:“云开发数据库的最佳实践”将在本周三晚上20:00按时会见!本课程将重点关注开发过程中使用云开发数据库的最佳实践,并在开发和调试方面介绍我们向开发人员提供的功能和建议。扫描图片中的迷你程序代码以预约

分享