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