Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to autoincrement id at every insert in Pymongo?

I am using pymongo to insert documents in the mongodb. here is code for router.py file

    temp = db.admin_collection.find().sort( [("_id", -1)] ).limit(1)
    for doc in temp:
        admin_id = str(int(doc['_id']) + 1)


    admin_doc ={
    '_id'       :   admin_id,
    'question'  :   ques,
    'answer'    :   ans,
    }
    collection.insert(admin_doc)

what should i do so that at every insert _id is incremented by 1.

like image 578
Shivamshaz Avatar asked Jan 13 '23 02:01

Shivamshaz


1 Answers

It doesn’t seem like a very good idea, but if you really want to go through with it you can try setup like below.

It should work good enough in a low traffic application with single server, but I wouldn't try anything like this with replicated or sharded enviroment or if you perform large amount of inserts.

Create separate collection to handle id seqs:

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

Whenever you need to insert new document use something similar to this:

def insert_doc(doc):
    doc['_id'] = str(db.seqs.find_and_modify(
        query={ 'collection' : 'admin_collection' },
        update={'$inc': {'id': 1}},
        fields={'id': 1, '_id': 0},
        new=True 
    ).get('id'))

    try:
        db.admin_collection.insert(doc)

    except pymongo.errors.DuplicateKeyError as e:
        insert_doc(doc)
like image 65
zero323 Avatar answered Jan 18 '23 01:01

zero323