Mongo ids 导致可怕的 URL

Posted

技术标签:

【中文标题】Mongo ids 导致可怕的 URL【英文标题】:Mongo ids leads to scary URLs 【发布时间】:2011-06-12 06:44:42 【问题描述】:

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

将可怕的 mongo id 映射到友好的 id 上的最简单和最具扩展性的方法是什么?

xx.com/posts/4d371056183b5e09b20001f9

xx.com/posts/a

M

【问题讨论】:

您可以参考 Google Group 的这篇帖子:groups.google.com/group/mongoid/browse_thread/thread/… 虽然它实际上并没有回答您的问题,但它为您提供了一些解决问题的方法。 【参考方案1】:

您可以在 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:https://github.com/hakanensari/mongoid-slug

【讨论】:

这个 +1 还不够,谢谢! (关键的东西)【参考方案2】:

在您的集合上定义一个友好的唯一字段(如 slug),在您的模型上对其进行索引,定义 to_param 以返回它:

def to_param
  slug
end

然后在您的查找器中,按 slug 而不是 ID 查找:

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

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

【讨论】:

为什么不在_id 字段中使用slug?如果它将是唯一的并被索引,则无需同时拥有两者。 _id 不限于 ObjectId 类型。 我认为是因为 mongodb 约定是在 _id 字段中有真正的 objectids。例如,mongoid 使用了一段时间的字符串 ID mongodb.org/pages/viewpage.action?pageId=16646831 并导致了问题 效率怎么样?搜索长字符串 slug 不会比按 id 搜索花费更长的时间吗? @eagor 如果你在一个字段上搜索,你应该索引那个字段。到那时,它应该大约与搜索具有给定 ID 的文档一样昂贵。【参考方案3】:

很遗憾,key 宏已从 mongo 中删除。对于自定义 ID, 用户现在必须覆盖 _id 字段。

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

【讨论】:

这有很多陷阱。如果在实例化对象(Band.new)时没有设置name,你最终会得到一个零_id。之后设置_id 不起作用。【参考方案4】:

这是我用来成功解决这个问题的一个很棒的宝石:Mongoid-Slug

https://github.com/digitalplaywright/mongoid-slug。

它为跨多个模型添加此功能提供了一个很好的界面。如果您想自己动手,至少可以查看他们的实现以获取一些想法。如果您要走这条路,请查看 Stringex gem、https://github.com/rsl/stringex 和里面的acts_as_url 库。这将帮助您获得漂亮的 dash-between-url slugs。

【讨论】:

mongoid-slug 的 url 导致 404 消息。 @JoseCarrillo 谢谢,已修复!

以上是关于Mongo ids 导致可怕的 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何修复火花可怕地误解 csv?

iOS - 可怕的代码签名错误 (0xE8008016) - 推送通知

改进可怕的多子查询 SQL

可怕的Full GC (转自Hbase不睡觉书)

可怕的漏洞,SQL注入漏洞实战演习

3年规划——比高房价更可怕的是,35岁以后你还能干什么?