我正在使用Rails / Mongoid制作类似于Instagram的应用。我想要一个可以在http://instagr.am/p/DJmU8/
等网址中使用的唯一ID最简单的方法是什么?我可以从Mongo创建的默认BSON ObjectID中获取这样的ID吗?
答案 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
更像这样的事情:
答案 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对该值进行哈希处理
Database 3milion rows numeric increment "_id" size on disk => 76MB, default object id => 86MB
答案 6 :(得分:0)
最好使用ObjectID作为唯一标识符,您可以通过MongoDB数据库驱动程序通过ObjectID创建它。
以下是唯一的ID模式:
您可以通过ObjectID()创建它:
exec*()
您可以使用进程ID,时间戳, 随机ID,并随机播放完整字符串。
const mongo = require('mongodb')
let uniqueObjectId = = new mongo.ObjectID();