我正在使用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。
答案 0 :(得分:7)
这似乎不是一个好主意,但如果您真的想要使用它,您可以尝试如下设置。
它应该在单个服务器的低流量应用程序中运行良好,但我不会尝试使用复制或分片环境或者执行大量插入操作。
创建单独的集合来处理id seqs:
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)
答案 1 :(得分:0)
如果要手动更改“_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('[_ _ 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。