【问题标题】:mongodb custom objectIdmongodb自定义objectId
【发布时间】:2013-08-01 18:51:16
【问题描述】:

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

我现在无法生成 _id 字段。

有没有办法自定义 mongo 为特定集合生成 objectId 的方式?

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

【问题讨论】:

  • 默认的_id不能保证你的唯一性有什么原因吗?
  • 它确实确保了唯一性。我的客户想要一个更用户友好的参考
  • 没有机制可以改变 _id 为 pymongo 中的集合生成的方式。 ObjectId 冲突的可能性很小,请参阅:stackoverflow.com/a/5694803/156427

标签: mongodb objectid


【解决方案1】:

我很确定您无法自定义 mongo 如何为特定集合生成 objectId(修改源代码然后重新构建)。您当然可以更改 _id 字段。这是一个快速而肮脏的代码 sn-p 演示了这一点:

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

【讨论】:

  • 为了获得最佳性能,对于重复的 _id 捕获 insert 的故障可能会更好,而不是尝试 find 它,并且仍然存在竞争条件,即第二台服务器(或其他线程)可以插入具有相同 _id/timestamp 的文档。
【解决方案2】:

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

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

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

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

如果你单独使用时间戳,你会遇到问题。

相反,我会推荐你​​:

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

有没有办法自定义 mongo 为特定集合生成 objectId 的方式?

正如@the_man_slim 在 python 中的回答,您可以插入自己的 id,但是您不能更新 _id 字段,所以要小心。

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多