我以前一直使用关系数据库,而我第一次使用NoSQL。我想与您分享我在使用它方面的有限经验。我希望这对像我这样对NoSQL陌生的开发人员有所帮助。
首先,让我们谈谈微信小程序云开发中集成的NoSQL。官方没有指定它是哪个NoSQL数据库,但是从开发文档和公开的API以及官方论坛中的讨论来看,它应该是简化版本。 MongoDB。应该指出的是,微信小程序云数据库的开发文档非常简短。对于像我这样没有NoSQL经验的用户,他们经常需要参考MongoDB的相关文档。
接下来,在使用此NoSQL云数据库文档级原子操作时,我将重点介绍最不舒服的痛点之一。当多个用户同时编辑同一字段时,我们经常使用原子操作来避免冲突。在使用它之前,我最担心的痛点是是否存在模式之间的区别,但是在使用它之后,我发现我已经习惯了它,并且我喜欢没有模式。我将在后面详细讨论。现在,让我们专门看一下MongoDB仅支持文档级别的原子操作。对我来说,这种限制鼓励我尝试将所有关系放在一个文档中。起初我对此有些抵触,并且我特别不习惯来自关系数据库的人员。更让我担心的是,由微信小程序云开发集成的云数据库是MongoDB的简化版本,它仅提供了非常有限的原子操作指令(命令)。对于某些常用的文档级原子操作,我必须设计自己的解决方案而不提供直接对应的命令。以下是我在实际开发中遇到的两个此类问题以及我的解决方案:
1.
应用场景:对于视频,我需要一个名为total_likes的字段。当用户单击“喜欢”时,该字段将增加1;当用户单击“喜欢”时,该字段将减少1。
痛点:小程序云数据库仅提供增量指令的原子操作,而不提供递减指令。
const _ = db.commanddb.collection('video').doc('video-id').update({ data: { total_likes: _.inc(1) }})
解决方案:要实现减量的原子运算,只需在增量指令中传递一个负数,例如
data: { total_likes: _.inc(-1)}
2.
应用场景:对于在线课程,我需要一个名为“订户”的字段来记录有多少人订阅了该课程。当用户单击“订阅”时,该字段需要记录用户的ID,名称和头像;当用户取消“订阅”时,需要从订户字段中删除该用户。
痛点:我们自然会想到使用Array数据类型来维护“订户”字段。尽管小程序 Cloud Database为数组提供了一些原子操作,例如推入,弹出,移位和取消转换,但它们不能实现取消订阅场景的原子操作,因为官方API尚未提供手动锁定。
解决方案:放弃数组并使用对象数据类型维护订户字段。最终数据将如下所示:
{ "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" }, ... }}