Ruby on rails 对于使用mongodb构建web应用程序的开发人员,您如何处理长主键?
RDBMS中的ID通常是从0到任意数字的简单整数,但通常可以将它们保持在5位数的范围内,这样就可以生成如下所示的URL myawesomeblog.com/posts/23456 但是对于mongodb,每个记录的唯一标识符如下所示。 47cc67093475061e3d95369d 基于这一点构建和应用程序将产生如下URL myawesomeblog.com/posts/47cc67093475061e3d95369d 我不喜欢那样?Ruby on rails 对于使用mongodb构建web应用程序的开发人员,您如何处理长主键?,ruby-on-rails,mongodb,Ruby On Rails,Mongodb,RDBMS中的ID通常是从0到任意数字的简单整数,但通常可以将它们保持在5位数的范围内,这样就可以生成如下所示的URL myawesomeblog.com/posts/23456 但是对于mongodb,每个记录的唯一标识符如下所示。 47cc67093475061e3d95369d 基于这一点构建和应用程序将产生如下URL myawesomeblog.com/posts/47cc67093475061e3d95369d 我不喜欢那样? 有没有办法让mongo给你一个更短、唯一的基于整数的id号
有没有办法让mongo给你一个更短、唯一的基于整数的id号?(像MySQL)这里有一个链接,可以从文档中创建递增值
http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22
我尝试过的一种方法(似乎有效)是使用以下文档创建序列集合:
{Name:“Posts”,Value:12345,_id:ObjectId(“47cc67093475061e3d95369d”)}
在插入Posts集合之前,您需要获取名为“Posts”的当前序列并增加其值。然后将该值用作新Post文档的URL友好ID或ObjectId
这种方法有点像使用Oracle的SELECT seq.NEXTVAL FROM DUAL作为主键
这并不完美,但它避免了必须抓取集合中的所有文档以及必须找到某个ID的最大值。一旦开始使用复制,任何创建递增键的操作都将无效。我正在使用一些东西生成一个独特的SHA前缀,就像git一样。它不会给您一个整数键,但可以很容易地修改为。它也不能保证是唯一的,但与递增键相比,发生冲突的可能性要小得多。我的模型中包含以下内容:
before_create :set_short_id
def set_short_id
prefix_length = 5
sha = Digest::SHA1.hexdigest(self.to_json)
short_id = nil
while short_id.nil? || Ticket.first(:short_id => short_id)
short_id = sha.first(prefix_length)
prefix_length += 1
end
self.short_id = short_id
end
def to_param
short_id
end
这意味着我的URL看起来像
myawesomeblog.com/posts/47cc6
这有点好一些。是的,我已经看到了,这对我来说没有太大意义。这个函数去哪里了?在Mongo源代码中?为ruby重写?它有效地做的只是拉取每个结果及其ID字段以增加一个值。您可以将它存储在mongo本身中(就像存储过程一样),每次只需引用它。只是好奇。。。那么MySql自动增量ID如何在复制中工作呢?我相信MySql在复制方面更具攻击性。Mongo致力于一个“最终一致”的模型。我还没有深入研究这个问题,但是有很多关于Mongo复制的屏幕显示,可能会对这个问题有更多的了解。