2010-07-20 27 views
5

中的RDBMS的ID通常是简单的整数,即去从0到任何数字,但通常你可以让他们在5位数的范围,这样就可以让网址看起来像这样对于使用mongodb构建Web应用程序的开发人员,您如何处理长主键?

myawesomeblog.com/posts/23456

但与mongodb每个记录的唯一标识符看起来像这样。基于该 47cc67093475061e3d95369d

,建设和应用程序会导致网址这样 myawesomeblog.com/posts/47cc67093475061e3d95369d

我不喜欢呢? 是否有反正让mongo给你基于整数的ID号码更短,更独特? (如MySQL)

回答

1

这里是从Docs创建递增的价值

http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22 
+0

是的,我已经看到了,这对我没有多大意义。 该功能在哪里?在Mongo源代码中?重写为红宝石? – concept47 2010-07-20 23:46:10

+1

所有它有效地做的是拉动每个结果和它的ID字段来增加一个值。你可以将它存储在mongo中(如存储过程),并且每次只引用它。 http://en.wikipedia.org/wiki/MongoDB#Server-Side_JavaScript_Execution http://neovintage.blogspot.com/2010/07/mongodb-stored-javascript-functions.html – 2010-07-21 11:53:43

1

一种方式的链接我试过(和它似乎工作)是创建一个序列集合中包含的文件:

{名称:“帖子”,值:12345,_id:物件(“47cc67093475061e3d95369d”)}

此前插入帖子集合,你会把自己的名称为“帖子”,并增加当前序列它的价值。然后将该值用作新的Post文档的URL友好标识或ObjectId。

这种方法有点像使用Oracle的SELECT seq.NEXTVAL FROM DUAL作为主键。

不完美,但它避免了必须抓取集合中的所有文档,并且必须找到某个ID的最大值。

1

一旦开始使用复制,任何创建增量键的操作都将无法工作。我使用的东西生成一个像git一样的独特SHA前缀。它不给你一个整数键,但它可以很容易地修改为。它也不能保证是唯一的,但是与碰撞增量键相比,您有更少的碰撞机会。我有以下的东西在我的模型:

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 

这意味着,我的网址看起来像myawesomeblog.com/posts/47cc6这是一个好一点。

+0

只是好奇...那么如何让MySql autoincrement id在复制中工作? – concept47 2010-07-27 03:17:49

+0

我相信MySQL在复制方面更具攻击性。 Mongo致力于“最终一致”的模式。我没有深入讨论过这个问题,但在Mongo复制中有大量的屏幕录像,可以让我们更清楚地了解这个问题。 – Emily 2010-07-29 13:39:18