⼩程序查询数据总数_⼩程序云开发联表数据查询lookup以及
云函数中的应⽤
⼤家好,我是宁⼀,今天我们来学习云开发联表数据的查询,并教⼤家如何在云函数中应⽤,在开发者⼯具中打印出我们查询的结果
先来设定⼀下场景,现在有两个表格,我们来查询⼀下徐⽼师所带的班级⾥⾯所有学⽣的平均成绩
1、联表查询
先看⼀下如何查询,将这两个表连起来的数据是class表中的id和student表中的class_id
所以我们应该先查出徐⽼师所在班级的id,是2,然后再查询student表中class_id为2的学⽣,张⼆和李⼆,计算这两个学⽣的平均成绩
来看⼀下在云开发中如何实现这样⼀个联表查询
⼤家要尽量学会看云开发⽂档,不过这个⽂档其实对于新⼿来说难度⽐较⼤,⼤家有想要我演⽰的功能可以在弹幕或者评论中告诉我,想看的⼈多的话,我会单独出⼀期来讲讲。
云开发⽂档中,在开发指引--数据库中,就有联表查询的介绍,我们使⽤lookup函数实现联表查询
from: <;要连接的集合名>,
localField: <;输⼊记录的要进⾏相等匹配的字段>,
foreignField: <;被连接集合的要进⾏相等匹配的字段>,
as: <;输出的数组字段名>
})
(1)lookup联接两个表格
应⽤到我们上⾯设定的场景,就像下⾯这样写,需要调⽤ end ⽅法来标志结束定义
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
}
]
}]
}
但是我们只需要徐⽼师所在班级学⽣的数据,所以我们需要加⼀个where条件,在lookup后⾯不能直接跟where,需要⽤match来代替。我们来改进⼀下上⾯的代码
(2)使⽤match进⾏条件查询
from: 'student',
localField: 'id',
foreignField: 'class_id',
as: 'stu'
制作查询类小程序})
.match({
teacher:"徐⽼师"
})
.end()
现在就只是返回徐⽼师所在班级的学⽣数据了,学⽣数据在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)直接返回学⽣成绩平均值
如果想要在被连接的表格中(本课程中的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这两个值,我们再进⾏下⾯的操作
(4)只显⽰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,就能控制最后输出的字段
2、在云函数中的应⽤
接下来看看怎样在云函数中运⽤吧,在开发者⼯具中打印出我们上⾯查询的结果
(1)在云数据库中添加数据
我们在开发者⼯具中打开云开发控制台,先在云数据库中创建这两个表,我们以创建class表为例
创建好表格后,我们再在表格中添加记录,根据我们上⾯表格中的数据来添加,下⾯添加的是⼆班的数据
数据都添加好了之后,来到开发者⼯具云函数⽂件夹下⾯创建⼀个名为test的云函数 云开发的这个项⽬我们是提前创建好了,如果不知道怎样创建的,可以看之前我发的30分钟创建创建并上线云开发⼩程序的课程,⾥⾯有教⼤家如何创建
(2)创建云函数并初始化数据库
创建完成后,系统会帮咱们创建⼀个test⽂件夹,我们打开test/index.js⽂件,将部分默认创建的代码删掉,并初始化数据库,像下⾯这样
// 云函数⼊⼝⽂件
const cloud = require('wx-server-sdk')
cloud.init()
//初始化数据库
const db = cloud.database()
const _ = dbmand
const $ = _.aggregate
// 云函数⼊⼝函数
exports.main = async (event, context) => {
//下⾯继续在这⾥⾯添加代码
}
(3)编辑云函数⼊⼝函数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。