我使用 mongodb 创建了一个应用程序,并且从未设置 _id 字段,因此默认为 mongo 的 objectId 字段。
我现在无法生成 _id 字段。
有没有办法自定义 mongo 如何为特定集合生成 objectId?
我想将其更改为 unix 时间戳对象以确保唯一性。
我很确定您无法自定义 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 实例进行大量写入时。
我想将其更改为 unix 时间戳对象以确保唯一性。
Unix时间戳并不像维基百科所说的那样独特(实施有时不同):http ://en.wikipedia.org/wiki/Unix_time
Unix 时间或 POSIX 时间是用于描述时间瞬间的系统,定义为自协调世界时 (UTC) 00:00:00 以来经过的秒数,
由于 UNIX 时间戳的粒度,ObjectId 有一个附加的 inc 复合物,如果操作发生在增加 inc 的同一秒。实际上,在大型数据库中增加该 inc 是很常见的。
如果您单独使用时间戳,您将面临问题。
相反,我会建议您:
有没有办法自定义 mongo 如何为特定集合生成 objectId?
正如@the_man_slim 在 python 中的回答所示,您可以插入自己的 id,但是您无法更新该_id
字段,因此请注意这一点。