当前位置: 首页 > 后端技术 > Node.js

小程序云开发实战系列02--云数据库

时间:2023-04-04 00:54:57 Node.js

之前一直在使用关系型数据库,第一次使用NoSQL。我想和大家分享一下我使用NoSQL的有限经验。希望对像我这样刚接触NoSQL的开发者有所帮助。帮助。首先说一下微信小程序云开发中集成的NoSQL。官方没有具体说明是什么NoSQL数据库,但是从开发文档、暴露的API、以及官方论坛的讨论来看,应该是MongoDB的简化版。需要指出的是,微信小程序在云数据库上的开发文档非常简短。对于像我这样没有多少NoSQL经验的用户,往往需要参考MongoDB的相关文档。下面重点说说我在使用这个NoSQL云数据库时最不爽的痛点之一——文档级别的原子操作。我们经常使用原子操作来避免多个用户同时编辑同一个字段(字段)时发生冲突。使用前最担心的痛点是有和没有schema的区别,但是用了之后发现自己挺习惯的,也喜欢没有schema的,会是稍后详细讨论。现在让我们仔细看看MongoDB只支持文档级别的原子操作。对我来说,这个限制鼓励我尝试将所有关系保存在一个文档中。我一开始有点抗拒这个,看不惯关系型数据库出身的人。更让我头疼的是,微信小程序云开发集成的云数据库是简化版的MongoDB,只提供非常有限的原子操作指令(command)。对于一些常用的文档级原子操作,我不得不自己构思解决方案,而没有提供直接对应的命令。下面是我在实际开发中遇到的两个这样的问题以及我的解决方案:1、应用场景:对于一个视频,我需要一个字段(field),叫做total_likes。当用户点击“赞”时,该字段加1,当用户取消“赞”时,该字段减1。痛点:小程序云数据库只提供自增命令的原子操作,不提供自减命令。const_=db.commanddb.collection('video').doc('video-id').update({data:{total_likes:_.inc(1)}})解决方法:实现自减的原子操作,increment指令中传入一个负数即可,如data:{total_likes:_.inc(-1??)}2.应用场景:对于一个在线课程,我需要一个名为subscribers的字段,记录有多少人订阅了到这门课程。当用户点击“订阅”时,该字段需要记录用户的id、姓名和头像;当用户取消“订阅”时,需要从订阅者字段中删除该用户。痛点:我们很自然地想到使用数组(Array)数据类型来维护subscribers字段。虽然小程序云数据库提供了一些对数组的原子操作,比如push、pop、shift、unshfit,但是无法取消订阅。场景的原子操作,因为官方一直没有提供手动加锁的API。解决方案:放弃Array,使用对象(object)数据类型来维护subscribers字段。最终数据将如下所示:{"subscribers":{"userID-1":{"name":"Xiaoming","avatar":"https://avatar-1.com"},"userID-2":{"name":"小红","avatar":"https://avatar-2.com"},"userID-3":{"name":"小丽","avatar":"https://avatar-3.com"},...}}用户订阅时的原子操作:constsubscriber="subscribers."+user.id;db.collection('class').where({_id:'classID',}).limit(1).update({data:{[subscriber]:{avatar:user.avatar,name:user.name,}}})当用户取消订阅时原子操作:constsubscriber="subscribers."+user.id;db.collection('class').doc('classID').update({data:{[subscriber]:_.remove()}})previoustext说到这里,我真的很喜欢无模式,因为它非常适合快速迭代开发。并且由于云数据库采用了类JSON的数据结构,对于全栈开发者来说,数据结构基本可以由前端自行定义。这种开发流程非常适合小团队,不需要庞大的并行开发,突出沟通效率和对产品需求的适应性。对了,微信小程序的云开发能力是从基础库2.2.3开始支持的,但是如果想支持所有版本的基础库,可以在app.json/game中添加字段"cloud":true.json系列第一章:小程序云开发实战系列01--云环境设置《Meetup丨活动报名组局》是我最近开发的一个小程序,作为活动报名工具。本系列文章主要来源于我在开发这个小程序时的心得体会。感兴趣的朋友可以扫描下方二维码进入我的小程序。