Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对于使用mongodb构建web应用程序的开发人员,您如何处理长主键?_Ruby On Rails_Mongodb - Fatal编程技术网

Ruby on rails 对于使用mongodb构建web应用程序的开发人员,您如何处理长主键?

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号

RDBMS中的ID通常是从0到任意数字的简单整数,但通常可以将它们保持在5位数的范围内,这样就可以生成如下所示的URL

myawesomeblog.com/posts/23456

但是对于mongodb,每个记录的唯一标识符如下所示。 47cc67093475061e3d95369d

基于这一点构建和应用程序将产生如下URL myawesomeblog.com/posts/47cc67093475061e3d95369d

我不喜欢那样?
有没有办法让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复制的屏幕显示,可能会对这个问题有更多的了解。