久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

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

喵寧一

喵寧一

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

replaceRoot({ newRoot: <表達(dá)式> })是固定寫(xiě)法,,將已有字段作為一個(gè)新節(jié)點(diǎn)輸出,,我們通常用他來(lái)將二級(jí)數(shù)組變成一級(jí)數(shù)組

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

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

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)擊查看視頻版↓↓↓

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

公眾號(hào):貓寧一

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多