首页 文章

生成唯一的URL

提问于
浏览
1

所以,我遇到了一个问题 . 我有一台服务器试图根据提供的数据生成“漂亮”的URL . 为了讨论起见,我们可以说博客文章的 Headers . 这个网址显然需要是唯一的,以便正确地表示资源 . 好吧,如果我错了,请纠正我..但这不是MongoDB中的一个简单问题吗?

起初我用Google搜索某种类型的自动递增字段 . 这回归了我的预期,但有一个明显的问题.10gen建议反对它 .

警告通常在MongoDB中,您不会对_id字段或任何字段使用自动增量模式,因为它不适用于具有大量文档的数据库 . 通常,默认值ObjectId对于_id更为理想 .

请注意粗体文字 . 10gen不建议你递增任何字段 .

所以,回到问题 . 如果我给服务器一个帖子 Headers ,我希望它创建一个帖子,我希望它自动将我的 Headers 更改为一个唯一的 Headers . 例如,如果我创建三个 Headers 为 foo 的帖子,我希望服务器为 /foo/foo1/foo2 创建网址 . 虽然,它可以是任何形式的独特添加,但重点在于服务器正在处理创建唯一URL的肮脏工作,而不是简单地失败并使用户反复尝试提出一个唯一的URL .

话虽如此,如何在_2711369中完成? 10gen建议不要增加,基本上我能找到的唯一唯一字符串是 ObjectID ,但 /foo50bbe1573b60ff0000000002 几乎不是"pretty" . 你不得不承认,如果你被迫使用 /foo50bbe1573b60ff0000000002 ,你也可以使用 /50bbe1573b60ff0000000002 . "pretty"在前5个字符后很久就消失了 .

那么,有关如何以MongoDB友好方式处理这个问题的任何想法/意见?

Potential Answer: 一个可怕的解决方案是重复创建文档,直到唯一的传递,但最多X次 . 例如,

  • 你可以尝试用 Headers 写它

  • 如果失败,请用 Headers 加上objectid的增量值(比如00002)来写它

  • 如果失败了,请用整个该死的objectid写出来 . 无论如何,我们已经失去了这一点 .

Potential Answer: 另一个可能的答案,就是做10gen建议反对,做一个增量字段 .

在上述两种解决方案中,我确信每种方法在各种方法中效率更高 . 例如:如果您的唯一字段非常可能是唯一的,那么解决方案1可能是最佳的,例如用户输入数据的40个字符 . 如果您处理4个字符,它可能会像糖蜜一样慢 .

Edit: Better Answer 我认为两者的结合是最好的 . 拥有"original" urls(例如: /foo )的集合,计算它们被写入的次数 . 将计数附加到目标网址,并且您有一个唯一的网址 . 我相信这将是10gen建议的性能问题之间的 balancer ,同时还会给你增量 .

1 回答

  • 4

    10gen警告不要使用某种悲观并发或使用服务器端javascript来查找ENTIRE集合的当前最大密钥,然后递增它并返回新的_id . MongoDB专为大量集合而设计,通常依赖于fire和忘记插入/更新 . 根据您所描述的应用程序的性质,这些都不是障碍(比10gen的建议更重要的是您对问题域的了解以及它如何与他们给您发出警告的项目相互作用) .

    一个不符合10gen建议的更好的方案是从帖子的其他一些属性构建一个url,即用户名,创建它的日期和时间等 .

    在您的博客文章示例中,您可能有类似的网址路径

    / posts / userName / 2013/3/5 / title-of-my-post

    您必须根据您正在显示的资源的属性来决定实际方案,但这是一个良好的开端 . 在此示例中,除非单个用户在同一天创建具有完全相同 Headers 的两个帖子,否则确保唯一URL将没有问题 . 在这种情况下,您的文档可能如下所示:

    {_ id:ObjectId(...),userName:“userName”,dateCreated:ISODate(“2013-03-05”), Headers :“我的帖子 Headers ”,正文:“...”}

    使用 {dateCreated: -1, userName: 1, title: 1} 上的唯一索引(这样可以很好地为用户排序和订购帖子提供帮助) .

相关问题