摘要:需要指出的是微信小程序關于云數據庫的開發文檔非常的簡略,對于像我這樣沒有太多經驗的用戶,很多時候需要參考的相關文檔。而更讓我苦惱的是微信小程序云開發集成的這個云數據庫是一個簡化版,只提供了非常有限的原子操作指令。
以前一直是使用關系型數據庫,第一次使用NoSQL,跟大家分享一下我有限的使用心得,希望對像我一樣初使用NoSQL的開發者有所幫助。
首先說說微信小程序云開發里集成的這個NoSQL,官方并沒有說明是哪種NoSQL數據庫,但從開發文檔和暴露的API,還有官方論壇里的討論來看應該是一個簡化版的MongoDB。需要指出的是微信小程序關于云數據庫的開發文檔非常的簡略,對于像我這樣沒有太多NoSQL經驗的用戶,很多時候需要參考MongoDB的相關文檔。
接下來重點談談我在使用這個NoSQL云數據庫時最不適應的一個痛點----文檔級別的原子操作。我們經常要使用到原子操作,來避免當多個用戶同時對同一個field(字段)編輯時發生沖突。我在使用前其實最擔心的痛點是有無schema的區別,但是使用下來發現我挺習慣,也挺喜歡無schema的,后文再詳說。現在具體來看看MongoDB只支持document(文檔)級別的原子操作。對于我來說,這個限制鼓勵我盡量把所有關系都放在一個document里。對此我一開始是有點抗拒的,對于從關系型數據庫過來的人特別不習慣。而更讓我苦惱的是微信小程序云開發集成的這個云數據庫是一個簡化版MongoDB,只提供了非常有限的原子操作指令(command)。對于一些常用的document級別原子操作,我必須構想自己的解決辦法,而沒有提供直接對應的command。以下是兩個我在實際開發中遇到的這類問題及我的解決辦法:
1.
應用場景:對于一個視頻,我需要一個叫total_likes的field(字段),當有用戶點擊“喜歡”時該field遞增1,當有用戶取消“喜歡”時該field遞減1。
痛點:小程序云數據庫只提供了遞增指令的原子操作,沒有提供遞減指令。
const _ = db.command db.collection("video").doc("video-id").update({ data: { total_likes: _.inc(1) } })
解決辦法:要實現遞減的原子操作,只需在遞增指令里傳入負數,如
data: { total_likes: _.inc(-1) }
2.
應用場景:對于一個線上課程,我需要一個叫subscribers的field(字段)來記錄有多少人訂閱了該課程。當有用戶點擊“訂閱”時該字段需記錄該用戶的id,名字及頭像;當有用戶取消“訂閱”時需把該用戶從subscribers字段里刪除。
痛點:我們很自然的會想到用數組(Array)數據類型來維護subscribers這個字段,雖然小程序云數據庫提供了一些針對數組的原子操作,如push,pop,shift和unshfit,可是無法實現取消訂閱這個場景的原子操作,因為官方還沒有提供手動上鎖的API。
解決辦法:棄用Array轉而使用對象(object)數據類型來維護subscribers這個字段。最終的數據看起來會是這樣的:
{ "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" }, ... } }
當有用戶訂閱時的原子操作:
const subscriber = "subscribers." + user.id; db.collection("class").where({ _id: "classID", }).limit(1).update({ data: { [subscriber]: { avatar: user.avatar, name: user.name, } } })
當有用戶取消訂閱時的原子操作:
const subscriber = "subscribers." + user.id; db.collection("class").doc("classID").update({ data: { [subscriber]: _.remove() } })
前文說到我很喜歡無schema,因為它非常適合快速迭代開發。而且由于云數據庫使用的是類似JSON的數據結構,對于全棧開發者,基本上可以實現由前端來定義數據結構。這樣的開發流程非常適合小團隊,不需要龐大的并行開發,突出溝通效率和對產品需求的隨機應變。順帶一提的是微信小程序云開發能力是從基礎庫2.2.3開始支持的,但如果要支持所有版本的基礎庫,可以在 app.json / game.json 中增加字段 "cloud": true
本系列第一章:小程序云開發實戰系列01--云環境設置
《Meetup丨活動報名組局》是我最近開發的一個活動報名預約工具小程序,這個系列文章主要來自我在開發這款小程序時的一些體會心得。感興趣的小伙伴可以掃下面的二維碼進入我的小程序。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100745.html
摘要:需要指出的是微信小程序關于云數據庫的開發文檔非常的簡略,對于像我這樣沒有太多經驗的用戶,很多時候需要參考的相關文檔。而更讓我苦惱的是微信小程序云開發集成的這個云數據庫是一個簡化版,只提供了非常有限的原子操作指令。 showImg(https://segmentfault.com/img/bVbmTlI?w=1000&h=563);以前一直是使用關系型數據庫,第一次使用NoSQL,跟大家...
摘要:但小程序的云開發也有一些局限性,我會在下一篇小程序云開發實戰系列云數據庫里分享我使用云開發數據庫的一些體會,敬請期待。 因為工作原因,使用過亞馬遜AWS的serverless構架,當時就覺得這是一個非常適合小程序的基礎設施。今年開始自己的微信小程序開發,決定用serverless架構,于是便使用了騰訊云做為小程序的后端,總結下來有以下幾個痛點: 當暴露API給小程序時,需要使用已備案的...
摘要:云函數支持單文件更新為了優化云函數代碼的上傳體驗,云函數新增單文件更新功能。開發者可在需上傳文件右鍵選擇云函數增量上傳體驗單文件更新能力。云調用云調用是云開發提供的基于云函數使用小程序開放接口的能力,目前覆蓋服務端調用開放數據等場景。 開篇彩蛋 由于近期小程序·云開發將上線付費功能(付費功能針對非基礎資源配額,基礎資源配額仍可免費使用)。為了給開發者更充足的時間進行調整,對于截止 20...
閱讀 2942·2021-10-28 09:32
閱讀 2967·2021-10-11 10:57
閱讀 3114·2021-10-08 10:05
閱讀 2588·2021-09-28 09:36
閱讀 2213·2019-08-30 15:55
閱讀 2270·2019-08-30 15:44
閱讀 2394·2019-08-30 14:02
閱讀 3076·2019-08-29 17:16