碼code | 巧用2種方法,打破20條雲開發數據庫限制

小程序·雲開發是小程序的一種後端開發模式,可以幫助開發者快速構建微信小程序的後端服務,無需再搭建服務器。數據庫

然而熟悉雲開發的開發者應該瞭解,即便雲開發能基本知足小程序開發需求,但在數據獲取上仍是有所限制。小程序

爲了防止誤操做以及保護小程序體驗,開發者是須要避免一次性獲取過量的數據,只獲取必要的數據,因此服務器一次默認而且最多返回 20 條記錄。但對於有數據大量獲取需求的開發者來講,只能放棄雲開發嗎?答案是no。後端

微信團隊以前在雲課程上就已經分享了打破數據庫列表限制的2種方法,經過雲函數最多可得到100條數據。(若是你也想上這類乾貨課程,能夠點擊連接填問卷,咱們將根據你們的需求肯定課程內容,並將於近期上線課程,敬請關注公衆號。)微信小程序

此次的方法分享是以音樂播放器小程序爲實例,經過雲函數調用雲數據庫,實現用戶上傳音樂的功能。promise

音樂播放器的核心功能是播放歌曲,也就是須要它可以獲取數據庫所存儲的歌曲信息,而後傳到小程序端,去實現播放器的播放、暫停、切換。bash

01 上傳歌曲信息至雲數據庫

歌曲信息包括id、歌曲名、歌手、封面、音頻文件等。服務器

playlist: [{
  _id: '',
  cover: '',
  singer: '',
  title: '',
  src: ''
}],複製代碼

02 利用雲函數獲取數據列表

getlist(){
  let that = this;
  wx.cloud.callFunction({
    name: ’getmlist’,//本身的雲函數名稱

    success: res=>{
      wx.stopPullDownRefresh()

      if(res.result){
        let playlist = res.result.data
        console.log({
          playlist
        })
        if(playlist = undefined  playlist.length == 0){
          wx.showToast({
            title: ’no data’,
          })
        }else{
          that.setData({
            isShowArtcle: true,
            playlist: playlist,
          })
        }

      } 
    },

    fail:err => {
      wx.stopPullDownRefresh()
      wx.showToast({
        title: ’no data’,
      })
    }
  })
}
複製代碼

然而目前的作法只能獲取20條數據,也不能支持用戶上傳音樂文件並正常加載播放。爲了實現這一功能,須要咱們設置雲函數,調用雲數據庫,從而打破數據限制。微信

方法1:分頁獲取數據

這個方法是將數據分爲若干頁,用戶能夠經過選擇頁數去獲取更多的數據。這也就須要指定skip,設置分頁,從第 0 條記錄開始取。假設一頁 10 條,如今要取第 2 頁,則能夠指定 skip 10 條記錄。async

代碼示例以下:函數

//雲函數入口文件
const cloud = require('wx-server-sdk')
cloud.init()

//雲函數入口函數
exports.main = async (event, context) => {
  const db = cloud.database()

  db.collection('musiclist')
    .where({
      // 填入當前用戶 openid
      _openid: 'xxx', 
    })
    //假設一頁有10條數據
    .skip(10) 
    .limit(10) 
    .get()
    .then(res => {
      console.log(res.data)
    })
    .catch(err => {
      console.error(err)
    })
    
}複製代碼

方法2:獲取全部數據

這個方法是用戶能夠直接獲取全部數據,但由於默認limit100條,可能一個請求沒法取出全部數據,因此須要分批次獲取,將集合中的全部歌曲信息獲取出來。

代碼示例以下:

//雲函數入口文件
const cloud = require('wx-server-sdk')

const db = wx.cloud.database()
cloud.init()

//雲函數入口函數
exports.main = async (event, context) => {
  getall:async(){
    const db = wx.cloud.database
    const Max_limit = 100
    // 先取出集合記錄總數
    const countResult = await db.collection('musiclist').count()
    const total = countResult.total
    // 計算需分幾回取
    const batchTimes = Math.ceil(total / Max_limit)
    
    const tasks = []
    for(let i = 0; i < batchTimes; i++) {
      const promise = db.collection('musiclist').skip(i * Max_limit).limit(Max_limit).get()
        tasks.push(promise)
    }
    // 等待全部
    return (await Promise.all(tasks)).reduce((acc, cur) => {
      data: acc.data.concat(cur.data),
      errMsg: acc.errMsg,
    })))
  }
}複製代碼

這兩類方法,本質上是屢次經過雲函數獲取數據,最終成功獲取全部集合數據。

由於雲函數端因屬於管理端,因此它能夠統計全部集合的記錄數。同時雲函數之間也可互相調用,還能經過雲函數後端 SDK 搭配使用多種服務,在數據獲取上有着必定的優點。當你們在使用雲開發時,不妨多利用雲函數進行數據庫和存儲的操做。

互動福利

掃碼關注公衆號,回覆關鍵詞『音樂』,就能獲取本次實例音樂播放器的源碼包

                                            

相關文章
相關標籤/搜索