我使用mongodb创建了一个应用程序,但从未设置_id字段,因此默认为mongo的objectId字段。
我现在无法生成_id字段。
有没有办法自定义mongo如何为特定集合生成objectId?
我想将其更改为unix时间戳对象以确保唯一性。
答案 0 :(得分:1)
我很确定你不能自定义mongo如何为特定集合生成objectId(缺少修改源代码然后重建)。你当然可以更改_id字段。这是一个快速而又脏的代码片段,展示了这一点:
import pymongo
import time
conn = pymongo.MongoClient()
def check_uniqueness(id):
if conn['test']['test'].find({'_id':id}.count() > 1
return False
return True
def main()
while True:
proposed_id = time.time()
if check_uniqueness(proposed_id):
conn['test']['test'].insert({'_id': proposed_time})
break
使用时间戳可能不是最好的选择,尤其是当您从时钟未同步的多台计算机连接到您的mongo实例时。你可以很容易地产生冲突,特别是如果你的mongo实例正在进行大量的写操作。
答案 1 :(得分:1)
我想将其更改为unix时间戳对象以确保唯一性。
Unix时间戳并不像维基百科所说的那样独特(实现有时会有所不同):http://en.wikipedia.org/wiki/Unix_time
Unix时间或POSIX时间是用于描述时间瞬间的系统,定义为自00:00:00协调世界时(UTC)以来经过的秒数,
由于UNIX时间戳的粒度,ObjectId有一个额外的复合词,如果一个操作发生在inc增加的同一秒。实际上,在大型数据库中增加该公司是很常见的。
如果你单独使用时间戳,你将面临问题。
相反,我会建议你:
有没有办法自定义mongo如何为特定集合生成objectId?
正如@the_man_slim的答案在python中显示的那样,你可以插入自己的id,但是你不能更新_id
字段,所以要小心。