|
10 人贊同了該文章 大家好,我是寧一,今天我們來學習云開發(fā)聯(lián)表數(shù)據(jù)的查詢,并教大家如何在云函數(shù)中應用,在微信開發(fā)者工具中打印出我們查詢的結(jié)果 先來設定一下場景,現(xiàn)在有兩個表格,我們來查詢一下徐老師所帶的班級里面所有學生的平均成績 1、聯(lián)表查詢先看一下如何查詢,將這兩個表連起來的數(shù)據(jù)是class表中的id和student表中的class_id 所以我們應該先查出徐老師所在班級的id,是2,然后再查詢student表中class_id為2的學生,張二和李二,計算這兩個學生的平均成績 來看一下在云開發(fā)中如何實現(xiàn)這樣一個聯(lián)表查詢 大家要盡量學會看云開發(fā)文檔,不過這個文檔其實對于新手來說難度比較大,大家有想要我演示的功能可以在彈幕或者評論中告訴我,想看的人多的話,我會單獨出一期來講講。 云開發(fā)文檔中,在開發(fā)指引--數(shù)據(jù)庫中,就有聯(lián)表查詢的介紹,我們使用lookup函數(shù)實現(xiàn)聯(lián)表查詢 lookup({
from: <要連接的集合名>,
localField: <輸入記錄的要進行相等匹配的字段>,
foreignField: <被連接集合的要進行相等匹配的字段>,
as: <輸出的數(shù)組字段名>})(1)lookup聯(lián)接兩個表格應用到我們上面設定的場景,就像下面這樣寫,需要調(diào)用 end 方法來標志結(jié)束定義 lookup({
from: 'student', //要關聯(lián)的表student localField: 'id', //class表中的關聯(lián)字段 foreignField: 'class_id', //student表中關聯(lián)字段 as: 'stu' //定義輸出數(shù)組的別名}).end()這個語句會查出來下面的結(jié)果,會查出班級的信息以及該班級所對應的所有學生的信息 {"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
}
]
}]}但是我們只需要徐老師所在班級學生的數(shù)據(jù),所以我們需要加一個where條件,在lookup后面不能直接跟where,需要用match來代替。我們來改進一下上面的代碼 (2)使用match進行條件查詢.lookup({
from: 'student',
localField: 'id',
foreignField: 'class_id',
as: 'stu'}).match({
teacher:"徐老師"}).end()現(xiàn)在就只是返回徐老師所在班級的學生數(shù)據(jù)了,學生數(shù)據(jù)在stu對應的數(shù)組里面 {"list":
[
{"_id":"5e847ab25eb9428600a512352fa6c7c4",
"id":2,
"teacher":"徐老師",
"cname":"二班",
//學生數(shù)據(jù)
"stu":[
{"_id":"37e26adb5eb945a70084351e57f6d717",
"class_id":2,
"sname":"張二",
"score":100
},
{"_id":"5e847ab25eb945cf00a5884204297ed8",
"class_id":2,
"sname":"李二",
"score":80
}
]
}
]}接下來我們繼續(xù)優(yōu)化代碼,直接返回學生的平均分數(shù) (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()現(xiàn)在打印的數(shù)據(jù)是這樣的 {"list":
[
{"_id":"5e847ab25eb9428600a512352fa6c7c4",
"id":2,
"teacher":"徐老師",
"cname":"二班",
"stu":[
{"_id":null,
"score":90
}
]
}
]}但是現(xiàn)在輸出的數(shù)據(jù)有點復雜,如果只想顯示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()現(xiàn)在打印出來的數(shù)據(jù)是這樣的 {"list":
[
{"score":90,"teacher":"徐老師"}
]}
2、在云函數(shù)中的應用接下來看看怎樣在云函數(shù)中運用吧,在微信開發(fā)者工具中打印出我們上面查詢的結(jié)果 (1)在云數(shù)據(jù)庫中添加數(shù)據(jù)我們在微信開發(fā)者工具中打開云開發(fā)控制臺,先在云數(shù)據(jù)庫中創(chuàng)建這兩個表,我們以創(chuàng)建class表為例 創(chuàng)建好表格后,我們再在表格中添加記錄,根據(jù)我們上面表格中的數(shù)據(jù)來添加,下面添加的是二班的數(shù)據(jù) 數(shù)據(jù)都添加好了之后,來到微信開發(fā)者工具云函數(shù)文件夾下面創(chuàng)建一個名為test的云函數(shù) 云開發(fā)的這個項目我們是提前創(chuàng)建好了,如果不知道怎樣創(chuàng)建的,可以看之前我發(fā)的30分鐘創(chuàng)建創(chuàng)建并上線云開發(fā)小程序的課程,里面有教大家如何創(chuàng)建 (2)創(chuàng)建云函數(shù)并初始化數(shù)據(jù)庫創(chuàng)建完成后,系統(tǒng)會幫咱們創(chuàng)建一個test文件夾,我們打開test/index.js文件,將部分默認創(chuàng)建的代碼刪掉,并初始化數(shù)據(jù)庫,像下面這樣 // 云函數(shù)入口文件const cloud = require('wx-server-sdk')cloud.init()//初始化數(shù)據(jù)庫const db = cloud.database()const _ = db.commandconst $ = _.aggregate// 云函數(shù)入口函數(shù)exports.main = async (event, context) => {
//下面繼續(xù)在這里面添加代碼}(3)編輯云函數(shù)入口函數(shù)// 云函數(shù)入口函數(shù)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()}編輯完成之后保存文件,并上傳部署云函數(shù) (4)上傳部署云函數(shù)右鍵點擊云函數(shù),選擇上傳并部署:云端安裝依賴(不上傳node_modules)
打開云開發(fā)控制臺—點擊云函數(shù)--找到test云函數(shù)點擊云端測試 在彈出的測試框中,直接點擊運行測試按鈕 下面就會打印出返回的結(jié)果,說明現(xiàn)在已經(jīng)聯(lián)表查詢成功了 點擊查看視頻版↓↓↓ 公眾號:貓寧一 |
|
|