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

(完)
闲谈时间价值
无聊随便谈谈
武汉二日游
感谢武汉 感谢李文亮医生
西安四日游
历史古城 大国巅峰
双指针:回文字符串(680)
删除一个字符,判断是否能构成回文字符串。所谓的回文字符串,是指具有左右对称特点的字符串,例如 "abcba" 就是一个回文字符串。
text标签出现中英文自动换行
word-break:break-all和word-wrap:break-word区别
解读Promise
Promise,宏任务和微任务相关
等待你的评论