Mongodb Mongo ID导致可怕的URL

Mongodb Mongo ID导致可怕的URL,mongodb,mongoid,Mongodb,Mongoid,这听起来可能是一个微不足道的问题,但对于面向消费者的应用程序来说却相当重要 将可怕的mongo id映射到友好的id的最简单和最可伸缩的方法是什么 xx.com/posts/4d371056183b5e09b20001f9 到 xx.com/posts/a M在您的集合上定义一个友好的唯一字段(如slug),为其编制索引,在您的模型上,将定义为_param以返回它: def to_param slug end 然后在查找器中,按段塞而不是ID查找: @post = Post.where(:

这听起来可能是一个微不足道的问题,但对于面向消费者的应用程序来说却相当重要

将可怕的mongo id映射到友好的id的最简单和最可伸缩的方法是什么

xx.com/posts/4d371056183b5e09b20001f9

xx.com/posts/a


M

在您的集合上定义一个友好的唯一字段(如slug),为其编制索引,在您的模型上,将
定义为_param
以返回它:

def to_param
  slug
end
然后在查找器中,按段塞而不是ID查找:

@post = Post.where(:slug => params[:id].to_s).first

这将使您可以将slug视为资源交互的有效PK,而且它们更漂亮。

您可以在mongoid中创建一个复合键,使用key宏替换默认id:

class Person
  include Mongoid::Document
  field :first_name
  field :last_name
  key :first_name, :last_name
end

person = Person.new(:first_name => "Syd", :last_name => "Vicious")
person.id # returns "syd-vicious"

如果您不喜欢这样做,请查看此gem:

我一直在使用一个伟大的gem来成功地回答这个问题:Mongoid Slug


它为跨多个模型添加此功能提供了一个很好的界面。如果你想推出自己的,至少看看他们的一些想法的实现。如果您要走这条路线,请查看Stringex gem,并在其中充当url库。这将帮助您在url段塞之间获得漂亮的破折号。

不幸的是,键宏已从mongo中删除。对于自定义ID, 用户现在必须覆盖_id字段

class Band
  include Mongoid::Document
  field :_id, type: String, default: ->{ name }
end

你可以参考谷歌集团的这篇文章:尽管它实际上没有回答你的问题,但它为你提供了一些解决问题的替代方案。为什么不在
\u id
字段中使用slug呢?如果它将是唯一的和索引的,那么没有必要两者都有
\u id
不限于
ObjectId
类型。我认为这是因为mongodb约定在\u id字段中有真正的ObjectId。例如,mongoid使用字符串ID有一段时间,这导致了问题效率如何?搜索长字符串slug不会比按id搜索花费更长的时间吗?@eagor如果您在搜索字段,您应该为该字段编制索引。在这一点上,它应该大约与搜索具有给定ID的文档一样昂贵。这还不够,谢谢!(关键的事情)这有很多问题。如果在实例化对象(Band.new)时未设置
名称
,则最终会得到一个nil
\u id
。之后设置
\u id
无效。mongoid slug的url会导致一条404消息。@JoseCarrilloThank,修复了它!