pymongo实现id自增

Snipaste_20220805_140001.jpg

问题

之前用sql都是有id自增长功能的,而现在的blog的数据库用的mongodb,系统生成的_id虽有唯一标识,但是并不适合用来做id,比如文章id等等。

思路1:

那么我这边一开始就利用代码自己让id自增。大概就是自己给设置一个id字段,在插入文档的时候搜寻出最后一篇文章的id,然后行+1的操作。

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
# 找到最后一个id preArticle_id = set1.find({}, {"article_id": 1}).sort("article_id", -1).limit(1) # 先设置为0 用于第一次添加 Article_id = 0 for x in preArticle_id: if x: Article_id = x["article_id"]

这个方案对于个人网站网络请求的肯定是没问题。我手点再快也基本没问题。但是个人对于存在并发高的情况就有很大的疑惑了。之后我就在我的请求中直接循环5次请求,并且连点。之后果然出现了重复id,所以这方法对于高并发无法使用。

Snipaste_20220805_091037.jpg

网上的方案(推荐)

然后看了一下网上的给出的代码,大概意思就是用一个另外的集合来查找并修改( find_and_modify )这个id并自增。

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
def insert_doc(doc, collection): doc['id'] = str(db.seqs.find_and_modify( query={ 'collection' : collection }, update={'$inc': {'id': 1}}, fields={'id': 1, '_id': 0}, new=True ).get('id'))

这个方法记得在需要用时新建一个队列集合设置一个初始id 0

          
  • 1
  • 2
  • 3
  • 4
db.seqs.insert({ 'collection' : 'blogs', 'id' : 0 })

下图是个人用循环测试并发的情况,这个方法的id是唯一的。

Snipaste_20220805_091745.jpg

(完)
韭菜成长记
优秀的交易者,通常都不合群一天不独处,我就会变得虚弱,我不以孤独为荣,但是我却以此为生。
他们说,鱼只有7秒的记忆
好像我也强不了多少吧!!!
一本书读懂财报--利润表
利润表解读
韭菜成长记4
慢慢研究,谨慎买入,机会无处不在
Vue 插槽
感觉不方便ヽ(ー_ー)ノ
使用 cloudflare 反代 gravatar 免费生成国内镜像
国内gravatar无法直接访问,cloudflare 可以做一个自己的镜像网址
等待你的评论