免费国产欧美国日产_少妇AV一区二区三区无码_蜜桃精品av无码喷奶水小说_jk18禁网站视频_精产国品一二三级产品区别_被夫の上司に犯波多野结衣_78m成人手机免费看_最爽最刺激18禁视频_偷偷色噜狠狠狠狠的777米奇

易優(yōu)GEO 重磅上線 ~ 一站式GEO優(yōu)化工具,讓豆包、文心一言、DeepSeek 在回答中主動推薦你的品牌,搶占AI流量入口!  點擊查看

小程序模板網(wǎng)

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

發(fā)布時間:2019-01-08 09:04 所屬欄目:小程序開發(fā)教程
 
以前一直是使用關(guān)系型數(shù)據(jù)庫,第一次使用NoSQL,跟大家分享一下我有限的使用心得,希望對像我一樣初使用NoSQL的開發(fā)者有所幫助。
首先說說微信小程序云開發(fā)里集成的這個NoSQL,官方并沒有說明是哪種NoSQL數(shù)據(jù)庫,但從開發(fā)文檔和暴露的API,還有官方論壇里的討論來看應(yīng)該是一個簡化版的MongoDB。需要指出的是微信小程序關(guān)于云數(shù)據(jù)庫的開發(fā)文檔非常的簡略,對于像我這樣沒有太多NoSQL經(jīng)驗的用戶,很多時候需要參考MongoDB的相關(guān)文檔。
 
接下來重點談?wù)勎以谑褂眠@個NoSQL云數(shù)據(jù)庫時最不適應(yīng)的一個痛點----文檔級別的原子操作。我們經(jīng)常要使用到原子操作,來避免當(dāng)多個用戶同時對同一個field(字段)編輯時發(fā)生沖突。我在使用前其實最擔(dān)心的痛點是有無schema的區(qū)別,但是使用下來發(fā)現(xiàn)我挺習(xí)慣,也挺喜歡無schema的,后文再詳說?,F(xiàn)在具體來看看MongoDB只支持document(文檔)級別的原子操作。對于我來說,這個限制鼓勵我盡量把所有關(guān)系都放在一個document里。對此我一開始是有點抗拒的,對于從關(guān)系型數(shù)據(jù)庫過來的人特別不習(xí)慣。而更讓我苦惱的是微信小程序云開發(fā)集成的這個云數(shù)據(jù)庫是一個簡化版MongoDB,只提供了非常有限的原子操作指令(command)。對于一些常用的document級別原子操作,我必須構(gòu)想自己的解決辦法,而沒有提供直接對應(yīng)的command。以下是兩個我在實際開發(fā)中遇到的這類問題及我的解決辦法:
 
1.
應(yīng)用場景:對于一個視頻,我需要一個叫total_likes的field(字段),當(dāng)有用戶點擊“喜歡”時該field遞增1,當(dāng)有用戶取消“喜歡”時該field遞減1。
痛點:小程序云數(shù)據(jù)庫只提供了遞增指令的原子操作,沒有提供遞減指令。
 
const _ = db.command
db.collection('video').doc('video-id').update({
  data: {
    total_likes: _.inc(1)
  }
})
解決辦法:要實現(xiàn)遞減的原子操作,只需在遞增指令里傳入負(fù)數(shù),如
 
data: {
  total_likes: _.inc(-1)
}
2.
 
應(yīng)用場景:對于一個線上課程,我需要一個叫subscribers的field(字段)來記錄有多少人訂閱了該課程。當(dāng)有用戶點擊“訂閱”時該字段需記錄該用戶的id,名字及頭像;當(dāng)有用戶取消“訂閱”時需把該用戶從subscribers字段里刪除。
痛點:我們很自然的會想到用數(shù)組(Array)數(shù)據(jù)類型來維護(hù)subscribers這個字段,雖然小程序云數(shù)據(jù)庫提供了一些針對數(shù)組的原子操作,如push,pop,shift和unshfit,可是無法實現(xiàn)取消訂閱這個場景的原子操作。
解決辦法:棄用Array轉(zhuǎn)而使用對象(object)數(shù)據(jù)類型來維護(hù)subscribers這個字段。最終的數(shù)據(jù)看起來會是這樣的:
 
{
    "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)有用戶訂閱時的原子操作:
 
const subscriber = "subscribers." + user.id;
db.collection('class').where({
  _id: 'classID',
}).limit(1).update({
  data: {
    [subscriber]: {
      avatar: user.avatar,
      name: user.name,
    }
  }
})
當(dāng)有用戶取消訂閱時的原子操作:
 
const subscriber = "subscribers." + user.id;
db.collection('class').doc('classID').update({
  data: {
    [subscriber]: _.remove()
  }
})
前文說到我很喜歡無schema,因為它非常適合快速迭代開發(fā)。而且由于云數(shù)據(jù)庫使用的是類似JSON的數(shù)據(jù)結(jié)構(gòu),對于全棧開發(fā)者,基本上可以實現(xiàn)由前端來定義數(shù)據(jù)結(jié)構(gòu)。這樣的開發(fā)流程非常適合小團(tuán)隊,不需要龐大的并行開發(fā),突出溝通效率和對產(chǎn)品需求的隨機(jī)應(yīng)變。順帶一提的是微信小程序云開發(fā)能力是從基礎(chǔ)庫2.2.3開始支持的,但如果要支持所有版本的基礎(chǔ)庫,可以在 app.json / game.json 中增加字段 "cloud": true
 
本系列第一章:小程序云開發(fā)實戰(zhàn)系列01--云環(huán)境設(shè)置
 
《Meetup丨活動報名組局》是我最近開發(fā)的一個活動報名預(yù)約工具小程序,這個系列文章主要來自我在開發(fā)這款小程序時的一些體會心得。感興趣的小伙伴可以掃下面的二維碼進(jìn)入我的小程序。


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://www.szcjxy.com/wxmini/doc/course/25069.html 復(fù)制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服