mongodb自定义objectId

时间:2013-08-01 18:51:17

标签: mongodb objectid

我使用mongodb创建了一个应用程序,但从未设置_id字段,因此默认为mongo的objectId字段。

我现在无法生成_id字段。

有没有办法自定义mongo如何为特定集合生成objectId?

我想将其更改为unix时间戳对象以确保唯一性。

2 个答案:

答案 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增加的同一秒。实际上,在大型数据库中增加该公司是很常见的。

如果你单独使用时间戳,你将面临问题。

相反,我会建议你:

  • 提供两个ID,一个用户友好,一个不用
  • 寻找替代它的其他东西,我不知道你的场景告诉你什么
  

有没有办法自定义mongo如何为特定集合生成objectId?

正如@the_man_slim的答案在python中显示的那样,你可以插入自己的id,但是你不能更新_id字段,所以要小心。