之前一直是使用關係型數據庫,第一次使用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。
痛點:小程序雲數據庫只提供了遞增指令的原子操做,沒有提供遞減指令。json
const _ = db.command db.collection('video').doc('video-id').update({ data: { total_likes: _.inc(1) } })
解決辦法:要實現遞減的原子操做,只需在遞增指令裏傳入負數,如小程序
data: { total_likes: _.inc(-1) }
2.segmentfault
應用場景:對於一個線上課程,我須要一個叫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--雲環境設置app
《Meetup丨活動報名組局》是我最近開發的一個活動報名預定工具小程序,這個系列文章主要來自我在開發這款小程序時的一些體會心得。感興趣的小夥伴能夠掃下面的二維碼進入個人小程序。