在MongoDB中创建简短,唯一的对象ID

时间:2011-05-11 00:18:18

标签: mongodb mongoid

我正在使用Rails / Mongoid制作类似于Instagram的应用。我想要一个可以在http://instagr.am/p/DJmU8/

等网址中使用的唯一ID

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

7 个答案:

答案 0 :(得分:10)

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

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

有关mongo的ObjectID结构的更多详细信息,请访问:http://www.mongodb.org/display/DOCS/Object+IDs

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

似乎有一个红宝石库可以进行此类转换http://rubyworks.github.com/radix/

答案 1 :(得分:6)

你可以试试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

答案 2 :(得分:3)

为什么不使用dylang/shortid

在猫鼬中:

_id: {
    type: String,
    'default': shortid.generate
},

或直接插入:

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

答案 3 :(得分:2)

答案 4 :(得分:0)

Hashids库用于生成这样的ID。请在此处查看☞https://github.com/peterhellberg/hashids.rb

答案 5 :(得分:0)

提到

@aav,您可以使用前4个字节,但是此值以秒为单位,您甚至可以每秒获得10.000或更多的插入。另一个对象objectID是Uniq,您需要检查“何时”从重复值“写问题”中得到错误吗?

  

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和许多其他]创建此字符串的基础

  

也许最好的选择是使用js timestamp中的4-5个字节,而使用ins中的INC   然后bson通过hids对该值进行哈希处理

enter image description here

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

答案 6 :(得分:0)

最好使用ObjectID作为唯一标识符,您可以通过MongoDB数据库驱动程序通过ObjectID创建它。

以下是唯一的ID模式:

  1. 首先,4个字节是秒
  2. 第二个5字节随机值
  3. 第三个3字节是随机计数器

您可以通过ObjectID()创建它:

exec*()
  

您可以使用进程ID,时间戳,   随机ID,并随机播放完整字符串。

const mongo = require('mongodb')
let uniqueObjectId =  = new mongo.ObjectID();