成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

小程序云開發(fā)實(shí)戰(zhàn)系列02--云數(shù)據(jù)庫

moven_j / 1747人閱讀

摘要:需要指出的是微信小程序關(guān)于云數(shù)據(jù)庫的開發(fā)文檔非常的簡(jiǎn)略,對(duì)于像我這樣沒有太多經(jīng)驗(yàn)的用戶,很多時(shí)候需要參考的相關(guān)文檔。而更讓我苦惱的是微信小程序云開發(fā)集成的這個(gè)云數(shù)據(jù)庫是一個(gè)簡(jiǎn)化版,只提供了非常有限的原子操作指令。


以前一直是使用關(guān)系型數(shù)據(jù)庫,第一次使用NoSQL,跟大家分享一下我有限的使用心得,希望對(duì)像我一樣初使用NoSQL的開發(fā)者有所幫助。
首先說說微信小程序云開發(fā)里集成的這個(gè)NoSQL,官方并沒有說明是哪種NoSQL數(shù)據(jù)庫,但從開發(fā)文檔和暴露的API,還有官方論壇里的討論來看應(yīng)該是一個(gè)簡(jiǎn)化版的MongoDB。需要指出的是微信小程序關(guān)于云數(shù)據(jù)庫的開發(fā)文檔非常的簡(jiǎn)略,對(duì)于像我這樣沒有太多NoSQL經(jīng)驗(yàn)的用戶,很多時(shí)候需要參考MongoDB的相關(guān)文檔。

接下來重點(diǎn)談?wù)勎以谑褂眠@個(gè)NoSQL云數(shù)據(jù)庫時(shí)最不適應(yīng)的一個(gè)痛點(diǎn)----文檔級(jí)別的原子操作。我們經(jīng)常要使用到原子操作,來避免當(dāng)多個(gè)用戶同時(shí)對(duì)同一個(gè)field(字段)編輯時(shí)發(fā)生沖突。我在使用前其實(shí)最擔(dān)心的痛點(diǎn)是有無schema的區(qū)別,但是使用下來發(fā)現(xiàn)我挺習(xí)慣,也挺喜歡無schema的,后文再詳說?,F(xiàn)在具體來看看MongoDB只支持document(文檔)級(jí)別的原子操作。對(duì)于我來說,這個(gè)限制鼓勵(lì)我盡量把所有關(guān)系都放在一個(gè)document里。對(duì)此我一開始是有點(diǎn)抗拒的,對(duì)于從關(guān)系型數(shù)據(jù)庫過來的人特別不習(xí)慣。而更讓我苦惱的是微信小程序云開發(fā)集成的這個(gè)云數(shù)據(jù)庫是一個(gè)簡(jiǎn)化版MongoDB,只提供了非常有限的原子操作指令(command)。對(duì)于一些常用的document級(jí)別原子操作,我必須構(gòu)想自己的解決辦法,而沒有提供直接對(duì)應(yīng)的command。以下是兩個(gè)我在實(shí)際開發(fā)中遇到的這類問題及我的解決辦法:

1.
應(yīng)用場(chǎng)景:對(duì)于一個(gè)視頻,我需要一個(gè)叫total_likes的field(字段),當(dāng)有用戶點(diǎn)擊“喜歡”時(shí)該field遞增1,當(dāng)有用戶取消“喜歡”時(shí)該field遞減1。
痛點(diǎn):小程序云數(shù)據(jù)庫只提供了遞增指令的原子操作,沒有提供遞減指令。

const _ = db.command
db.collection("video").doc("video-id").update({
  data: {
    total_likes: _.inc(1)
  }
})

解決辦法:要實(shí)現(xiàn)遞減的原子操作,只需在遞增指令里傳入負(fù)數(shù),如

data: {
  total_likes: _.inc(-1)
}

2.

應(yīng)用場(chǎng)景:對(duì)于一個(gè)線上課程,我需要一個(gè)叫subscribers的field(字段)來記錄有多少人訂閱了該課程。當(dāng)有用戶點(diǎn)擊“訂閱”時(shí)該字段需記錄該用戶的id,名字及頭像;當(dāng)有用戶取消“訂閱”時(shí)需把該用戶從subscribers字段里刪除。
痛點(diǎn):我們很自然的會(huì)想到用數(shù)組(Array)數(shù)據(jù)類型來維護(hù)subscribers這個(gè)字段,雖然小程序云數(shù)據(jù)庫提供了一些針對(duì)數(shù)組的原子操作,如push,pop,shift和unshfit,可是無法實(shí)現(xiàn)取消訂閱這個(gè)場(chǎng)景的原子操作,因?yàn)楣俜竭€沒有提供手動(dòng)上鎖的API。
解決辦法:棄用Array轉(zhuǎn)而使用對(duì)象(object)數(shù)據(jù)類型來維護(hù)subscribers這個(gè)字段。最終的數(shù)據(jù)看起來會(huì)是這樣的:

{
    "subscribers": {
        "userID-1": {
            "name": "小明",
            "avatar": "https://avatar-1.com"
        },
        "userID-2": {
            "name": "小紅",
            "avatar": "https://avatar-2.com"
        },
        "userID-3": {
            "name": "小李",
            "avatar": "https://avatar-3.com"
        },
        ...
    }
}

當(dāng)有用戶訂閱時(shí)的原子操作:

const subscriber = "subscribers." + user.id;
db.collection("class").where({
  _id: "classID",
}).limit(1).update({
  data: {
    [subscriber]: {
      avatar: user.avatar,
      name: user.name,
    }
  }
})

當(dāng)有用戶取消訂閱時(shí)的原子操作:

const subscriber = "subscribers." + user.id;
db.collection("class").doc("classID").update({
  data: {
    [subscriber]: _.remove()
  }
})

前文說到我很喜歡無schema,因?yàn)樗浅_m合快速迭代開發(fā)。而且由于云數(shù)據(jù)庫使用的是類似JSON的數(shù)據(jù)結(jié)構(gòu),對(duì)于全棧開發(fā)者,基本上可以實(shí)現(xiàn)由前端來定義數(shù)據(jù)結(jié)構(gòu)。這樣的開發(fā)流程非常適合小團(tuán)隊(duì),不需要龐大的并行開發(fā),突出溝通效率和對(duì)產(chǎn)品需求的隨機(jī)應(yīng)變。順帶一提的是微信小程序云開發(fā)能力是從基礎(chǔ)庫2.2.3開始支持的,但如果要支持所有版本的基礎(chǔ)庫,可以在 app.json / game.json 中增加字段 "cloud": true

本系列第一章:小程序云開發(fā)實(shí)戰(zhàn)系列01--云環(huán)境設(shè)置

《Meetup丨活動(dòng)報(bào)名組局》是我最近開發(fā)的一個(gè)活動(dòng)報(bào)名預(yù)約工具小程序,這個(gè)系列文章主要來自我在開發(fā)這款小程序時(shí)的一些體會(huì)心得。感興趣的小伙伴可以掃下面的二維碼進(jìn)入我的小程序。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19439.html

相關(guān)文章

  • 程序開發(fā)實(shí)戰(zhàn)系列02--數(shù)據(jù)庫

    摘要:需要指出的是微信小程序關(guān)于云數(shù)據(jù)庫的開發(fā)文檔非常的簡(jiǎn)略,對(duì)于像我這樣沒有太多經(jīng)驗(yàn)的用戶,很多時(shí)候需要參考的相關(guān)文檔。而更讓我苦惱的是微信小程序云開發(fā)集成的這個(gè)云數(shù)據(jù)庫是一個(gè)簡(jiǎn)化版,只提供了非常有限的原子操作指令。 showImg(https://segmentfault.com/img/bVbmTlI?w=1000&h=563);以前一直是使用關(guān)系型數(shù)據(jù)庫,第一次使用NoSQL,跟大家...

    masturbator 評(píng)論0 收藏0
  • 程序開發(fā)實(shí)戰(zhàn)系列01--環(huán)境設(shè)置

    摘要:但小程序的云開發(fā)也有一些局限性,我會(huì)在下一篇小程序云開發(fā)實(shí)戰(zhàn)系列云數(shù)據(jù)庫里分享我使用云開發(fā)數(shù)據(jù)庫的一些體會(huì),敬請(qǐng)期待。 因?yàn)楣ぷ髟?,使用過亞馬遜AWS的serverless構(gòu)架,當(dāng)時(shí)就覺得這是一個(gè)非常適合小程序的基礎(chǔ)設(shè)施。今年開始自己的微信小程序開發(fā),決定用serverless架構(gòu),于是便使用了騰訊云做為小程序的后端,總結(jié)下來有以下幾個(gè)痛點(diǎn): 當(dāng)暴露API給小程序時(shí),需要使用已備案的...

    Lin_R 評(píng)論0 收藏0
  • 開發(fā)數(shù)據(jù)庫又增新技能!

    摘要:云函數(shù)支持單文件更新為了優(yōu)化云函數(shù)代碼的上傳體驗(yàn),云函數(shù)新增單文件更新功能。開發(fā)者可在需上傳文件右鍵選擇云函數(shù)增量上傳體驗(yàn)單文件更新能力。云調(diào)用云調(diào)用是云開發(fā)提供的基于云函數(shù)使用小程序開放接口的能力,目前覆蓋服務(wù)端調(diào)用開放數(shù)據(jù)等場(chǎng)景。 開篇彩蛋 由于近期小程序·云開發(fā)將上線付費(fèi)功能(付費(fèi)功能針對(duì)非基礎(chǔ)資源配額,基礎(chǔ)資源配額仍可免費(fèi)使用)。為了給開發(fā)者更充足的時(shí)間進(jìn)行調(diào)整,對(duì)于截止 20...

    Eastboat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

moven_j

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<