电竞比分网-中国电竞赛事及体育赛事平台

分享

小程序云開發(fā)聯(lián)表數(shù)據(jù)查詢lookup以及云函數(shù)中的應用

 一利陽光故事會 2022-05-03 發(fā)布于北京

喵寧一

喵寧一

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

replaceRoot({ newRoot: <表達式> })是固定寫法,將已有字段作為一個新節(jié)點輸出,我們通常用他來將二級數(shù)組變成一級數(shù)組

mergeObjects是累計器操作符,$.arrayElemAt(['$stu', 0]), '$$ROOT’]就是將stu數(shù)組中的第一個元素,也就是[{"_id":null,"score":90}]合并到數(shù)組的跟節(jié)點上面,也就是與teacher、cname這些字段同一級

project里面將_id后面設為0,將我們想要顯示的元素后面設為1,就能控制最后輸出的字段

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)表查詢成功了

點擊查看視頻版↓↓↓

https://www.bilibili.com/video/BV1954y1X7RF/www.bilibili.com/video/BV1954y1X7RF/

公眾號:貓寧一

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多