【问题标题】:How to autoincrement id at every insert in Pymongo?如何在 Pymongo 中的每次插入时自动增加 id?
【发布时间】:2013-10-31 17:28:25
【问题描述】:

我正在使用 pymongo 在 mongodb 中插入文档。 这是 router.py 文件的代码

    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)

我应该怎么做才能在每次插入时 _id 增加 1。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我使用游标获取最后插入的文档的 id 并在该 id 中增加 1。但它不起作用。
  • 使用 pymongo 会自动为您插入“_id”。你确定你真的需要手动改变它吗?它主要用作集合中 mongodb 文档的内部唯一变量。您只需删除密钥,mongo 就会生成一个新的唯一密钥。不能保证 ['_id'] + 1 是一个新的唯一 id。
  • 查看这个问题的答案:stackoverflow.com/questions/8384029/…

标签: python mongodb pymongo


【解决方案1】:

如果您想手动更改“_id”值,您可以通过更改返回文档中的 _id 值来实现。您可以按照与您在问题中提出的方式类似的方式执行此操作。 但我认为这种方法不可取

curs = db.admin_collection.find().sort( [("_id", -1)] ).limit(1)
for document in curs:
    document['_id'] = str(int(document['_id']) + 1)
    collection.insert(document)

手动创建自己的 ID 通常不是一个好主意。这些值必须是唯一的,并且不能保证 str(int(document['_id']) + 1) 总是唯一的。

如果您想复制文档,您可以删除“_id”键并插入文档。

curs = db.admin_collection.find().sort( [("_id", -1)] ).limit(1)
for document in curs:
    document.pop('_id',None)
    collection.insert(document)

这会插入文档并允许 mongo 生成唯一 id。

【讨论】:

  • 感谢@RMcG 这样的努力。我非常感谢您的可选方法
【解决方案2】:

这似乎不是一个好主意,但如果你真的想通过它,你可以尝试如下设置。

它应该在具有单个服务器的低流量应用程序中工作得足够好,但我不会在复制或分片环境中尝试这样的事情,或者如果您执行大量插入。

创建单独的集合来处理 id 序列:

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

每当您需要插入新文档时,请使用类似以下内容:

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)

【讨论】:

    【解决方案3】:

    这已经很晚了,但是不理会 ObjectId 并仍然添加一个顺序 id 以用作从前端 api 调用特定文档(或其道具)的参考呢?从 api 获取时,我一直在努力让前端在 ObjectId 上删除“”。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多