og

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

Article at   2022/08/05 06:03  Published  code  Category,viewed  119  times

Relevant tags:    Python 

Address:   https://kedong.me/article/88

Copyright Notice: Freely reproduced for non-commercial use