【问题标题】:Creating short, unique object id's in MongoDB在 MongoDB 中创建简短、唯一的对象 ID
【发布时间】:2011-08-22 21:46:51
【问题描述】:

我正在使用 Rails/Mongoid 制作一个类似于 instagram 的应用程序。我想要一个可以在 http://instagr.am/p/DJmU8/ 等网址中使用的唯一 ID

最简单的方法是什么?我可以从 Mongo 创建的默认 BSON ObjectID 派生出这样的 ID 吗?

【问题讨论】:

    标签: mongodb mongoid


    【解决方案1】:

    您可以尝试使用 ObjectID 的前 4 个字节(它们将代表时间戳)。

    但是,为了 100% 安全,最好通过实现一个计数器来生成真正唯一的短 id。您可以使用单独的集合来维护计数器的当前值。

    更多关于 mongo 的 ObjectID 结构的细节可以在这里找到:http://www.mongodb.org/display/DOCS/Object+IDs

    作为替代方案,您可以将转换十六进制字符串 id 表示形式转换为基于 36 个符号(26 个拉丁字母 + 10 个数字)的表示形式。显然会更短。

    似乎有一个 ruby​​ 库,可以进行这样的转换http://rubyworks.github.com/radix/

    【讨论】:

    • 非常有用的答案,但为什么是 22 个拉丁字母 + 10 个数字而不是 26 个拉丁字母 + 10 个数字?
    • 我们可以更深入地使用 52 个拉丁字母、10 个数字和一些其他文字 _- =) 然后使用 radix64 我们得到长度 log64(2^96) = 16 而不是原来的 log16(2^96) = 24
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      你可以试试 Mongoid::Token

      https://github.com/thetron/mongoid_token

      来自文档:

      这个库是一种快速而简单的方法来生成独特的、随机的 在你不能的情况下,你的 mongoid 文档的令牌,或者 不想使用 slug 或默认的 MongoDB ID。

      Mongoid::Token 可以帮助扭转这一局面:

      http://myawesomewebapp.com/video/4dcfbb3c6a4f1d4c4a000012/edit

      变成类似这样的东西:

      http://myawesomewebapp.com/video/83xQ3r/edit

      【讨论】:

        【解决方案4】:

        为什么不使用dylang/shortid

        使用 npm 安装 npmjs.com/package/shortid:

        npm i shortid
        

        然后要求:

        const shortid = require('shortid');
        

        在猫鼬模式中:

            new Schema {
                _id: {
                    type: String,
                    default: shortid.generate
                }
            }
        

        或者直接插入:

            users.insert({
                _id: shortid.generate()
                name: ...
                email: ...
                });
        

        【讨论】:

          【解决方案5】:

          Hashids 库用于生成这样的 ID。看这里☞https://github.com/peterhellberg/hashids.rb

          【讨论】:

            【解决方案6】:

            @aav 提到你可以使用前 4 个字节,但这个值以秒为单位,你甚至可以获得每秒 10.000 或更多的插入。另一件事 objectID 是 Uniq,您需要检查“何时”从重复值“Write Concerns”中得到错误?

            new Date().getTime() - 以毫秒为单位 => 1557702577900 为什么不使用最后 4 个字节?

            这段代码看起来很有趣:

            https://github.com/treygriffith/short-mongo-id/blob/master/lib/objectIdToShortId.js

            还要检查 ObjectID 时间戳解析器:

            https://steveridout.github.io/mongo-object-time/

            或者你可以执行 ObjectId().toString() 并且这个字符串的基础由hashids [nodejs,php, andmanymore] 创建新的

            也许最好的选择是使用来自 js 时间戳和 INC 的 4-5 个字节 bson 然后通过 hids 散列这个值

            Database 3milion rows numeric increment "_id" size on disk => 76MB, default object id => 86MB
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-03
              • 2023-02-04
              相关资源
              最近更新 更多