0

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

我现在无法生成 _id 字段。

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

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

4

2 回答 2

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 实例进行大量写入时。

于 2013-08-01T20:17:16.017 回答
1

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

Unix时间戳并不像维基百科所说的那样独特(实施有时不同):http ://en.wikipedia.org/wiki/Unix_time

Unix 时间或 POSIX 时间是用于描述时间瞬间的系统,定义为自协调世界时 (UTC) 00:00:00 以来经过的秒数,

由于 UNIX 时间戳的粒度,ObjectId 有一个附加的 inc 复合物,如果操作发生在增加 inc 的同一秒。实际上,在大型数据库中增加该 inc 是很常见的。

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

相反,我会建议您:

  • 拥有两个 ID,一个用户友好,一个不友好
  • 寻找其他东西来代替它,我对你的场景了解得不够多,无法告诉你什么

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

正如@the_man_slim 在 python 中的回答所示,您可以插入自己的 id,但是您无法更新该_id字段,因此请注意这一点。

于 2013-08-01T20:59:23.680 回答