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

(完)
韭菜成长记4
慢慢研究,谨慎买入,机会无处不在
这两月又看不少片
养蜂人,哥斯拉大战金刚2,热辣滚烫,毒舌律师,功夫熊猫4,破墓,飞驰人生2,新生,辐射,寄生兽
记录下后端代码pymongo连不上数据库问题
docker mongo的配置文件修改
无锡踏青
一次着急的旅行
React-redux应用
总觉的没vuex舒服,依样画饼吧
韭菜成长记5
已经一岁咯
等待你的评论