00:01
最近有幸观看了腾讯云开发者视频号发布的中国数据库前世今生纪录片,看完该纪录片,我对中国数据库的发展历程有了更深入的认识,感兴趣的小伙伴可以去观看一下。本视频介绍的内容也和数据库有关。让我们继续。熟悉mango DB的用户应该都知道,它并不像一些关系型数据库那样提供内置的自增ID功能,而是默认使用objected作为主键的类型,但有时使用自增ID可能更符合某些应用场景的需求,例如。兼容现有系统。某些系统需要将数据迁移到mango DB时,如果原来使用的是自增ID作为主键,在迁移过去之后,需要保持自增主键的特点。对外展示的ID。在一些应用场景中,一个更直观、更易记的标识符对用户更友好。例如展示给用户的用户编号、文章编号等,这在需要手动输入或与用户交流时特别有用。
01:05
因为自增ID比object t更短,更易读。虽然mango DB不支持自增ID的功能,但我们仍然可以使用其他方式来实现此功能。本文将会介绍如何在mango DB中实现自增ID序号。准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本视频一探究竟吧,Let'SGO.实现自增序号的方法有很多,本视频介绍的是官方推荐的一种实现方式及使用计数器集合counters实现自增序号,该集合的文档结构如下。该集合有两个字段,ID和s seq value ID代表某个集合的名称,S seq value为自增序号。由于Counts集合中的ID字段值代表某个集合的名称。因此,我们可以利用counters集合为多个集合实现自增序号,而不仅限于单个集合。
02:03
那么counts集合要怎么实现s EQ value字段的自增呢?这就需要用到find one and update方法了。Find one and update方法用于查找并更新集合中的单个文档。该方法还支持选择性的返回更新前或更新后的文档。下面是一个简单案例的具体流程。第一个步骤是开始流程,流程图从开始节点开始。第二个步骤创建posts文章和counters计数器集合。下面是代码示例。第三个步骤是获取自增序号,使用find one and update从counts集合中获取并自增s seq value, 如果counts集合中idv posts的文档不存在,则通过absurd初选项自动创建该文档,并初始化s EQ value为1。下面是代码示例。
03:03
第4个步骤是向posts集合中插入新文档。使用从counters集合中获取的自增s EQ value作为新文档的一个字段插入到posts集合中。下面是代码示例。第5个步骤是流程结束。通过前面的简单例子了解了如何实现自增ID并插入到对应文档中的实现流程。接下来我们看一下完整的mango DB脚本示例代码吧。接下来是简单的go语言代码实现,在实现之前,我们需要安装go mango X拈。下面是核心代码展示。想阅读完整的代码实现,可前往评论区。
04:04
本视频介绍的实现方案需要提及两个重要问题,那就是并安全与数据一致性问题。首先是并发安全的问题。使用计数器集合实现自增序号的方案,在并发更新时,S EQ value是否是并发安全的答案是肯定的。这是因为mango DB的Dollar increase操作符能原子性的对文档中指定字段的值进行递增或递减操作。当多个操作同时对同一文档执行Dollar increase命令时,Monggo DB会确保这些操作按顺序依次执行,每个操作都会基于前一个操作的结果进行累加。例如,如果两个并发操作分别对某个字段执行Dollar increase.1。最终结果是该字段的值增加了2,而不会出现仅增加1的情况。然后是数据一致性问题。在设计更新多个集合如counts和posts的操作时,确保数据的一致性尤为重要。假设在s EQ value自增后,由于某种意外,例如像posts集合插入文档时出错,导致插入失败,那么此次自增的s EQ value就不会成功保存到posts集合中。
05:19
从而使序列号出现空洞。这种情况下,下一次操作会跳过这个序列号,导致保存到posts集合中的序列号不连续。如果你的业务逻辑要求序列号必须是连续的,那么使用事物是必要的。通过使用事物,我们可以确保整个操作的原子性。要么所有相关操作,包括s EQ value的自增和文档的插入都成功执行,要么在发生任何问题时回滚所有更改。这种方式能够有效避免posts集合中的序列号的不连续性,并确保数据的一致性。前面讲了这么多内容,让我们做个小结吧。本文详细探讨了在mango DB中实现自增ID序号的方法,其核心思路是通过创建counts集合,并使用Dollar increase操作符来维护自增的ID序号s EQ value, 从而满足特定应用场景下的需求。
06:18
这种自增序号的实现方式特别适用于需要为用户可见的实体,如文章编号、用户编号生成更短、更直观标识符的场景。相比Objected自增ID更易记、更直观,有助于提高用户体验。本视频到这里就结束了,点个关注吧,我们下次再会。
我来说两句