Pet*_*rov 3 mongodb bson objectid
在我的应用程序中,我让mongo通过其ObjectId方法生成订单ID.
但是在用户测试中,我们有一些担心订单ID是人为的"恐吓",即如果你需要通过电话与某人讨论你的订单,读出24个字母数字字符有点单调乏味.
与此同时,我真的不想存储两个不同的id,一个是"人类可访问的",另一个是内部使用的mongo.
所以我的问题是 - 有没有办法选择长度为6或甚至8的mongo objectId字符串的子字符串,我可以相当确定它是唯一的?
例如,如果我有像这样的mongo objectid
id = '4b28dcb61083ed3c809e0416'
Run Code Online (Sandbox Code Playgroud)
也许我可以拿出来
human_id = id.substr(0,7);
Run Code Online (Sandbox Code Playgroud)
并确保我总是为我的订单获得唯一的ID ...
当然,优点是这些是订单,人类创造的也是如此,因此每毫秒不会有数百万.另一方面,如果两个订单具有相同的缩短ID,那真的会成为一个问题......
---更清楚的解释---
我想问一个更好的问题是:
例如,如果我决定只使用mongo id的最后6个字符,是否有某种"概率"度量,这些6个字符在给定的一周内会重复?
给定一定数量的mongo并行运行,一周内有一定数量的用户等.
如果您有多个具有多个进程的Web服务器,那么您可能无法删除唯一性.
如果你看看的性质ObjectId:
你会发现那里没有太多可以安全移除的东西.由于前4个字节是时间,因此实现一种以干净和安全的方式删除部分时间戳的算法将是一项挑战.
在存在多个服务器和/或进程作为数据库服务器的客户端的情况下,使用机器标识符和进程标识符.如果你放弃其中任何一个,你可能会再次重复.作为最后3个字节的随机值用于确保同一进程内同一进程中的两个标识符是唯一的,即使经常请求也是如此.
如果您将它用作订单id,并且您希望确保唯一性,那么我不会修剪任何远离12字节数字的内容,因为它经过精心设计,可提供强大而高效的分布式机制,以便在有许多连接数据库时生成唯一数字客户端.
如果您使用ObjectId的最后5个字符...,并且在给定的时间段内,发生冲突的概率是多少?
冲突的可能性很高.进程ID可以在整个期间保持不变,而另一个数字只是在4095个订单之后重复的递增数字.但是,如果流程再循环,那么您也有可能与旧订单等发生冲突.如果您正在谈论多个数据库客户端,那么机会也会增加.我只是不打算削减这个数字.尝试下订单的不满意客户不值得.
当生成多个数据库客户端时,即使时间戳和随机种子值也不够ObjectIds.当您开始查看各个部分时,尤其是在数据库客户端的上下文中,您应该看到为什么这些部分存在,以及为什么删除它们可能导致生成中的崩溃ObjectId.
我建议你实现一个算法来创建一个唯一的数字并将其存储在数据库中.这很简单.它确实会影响性能,但它是安全的.
我刚才写了这个答案关于ObjectId在网址中使用的挑战.它包含一个链接,指向如何使用MongoDB创建唯一的自动递增数字.
| 归档时间: |
|
| 查看次数: |
1487 次 |
| 最近记录: |