pymongo实现id自增

Snipaste_20220805_140001.jpg

问题

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

思路1:

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

# 找到最后一个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并自增。

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

db.seqs.insert({
    'collection' : 'blogs',
    'id' : 0
})

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

posted @   豆腐炒年糕  阅读(279)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示