所以,我遇到了一个问题。我有一台服务器试图根据提供的数据生成“漂亮”的URL。为了讨论起见,我们可以说博客文章的标题。这个网址显然需要是唯一的,以便正确地表示资源。好吧,如果我错了,请纠正我..但这不是MongoDB中的一个简单问题吗?
起初我用Google搜索某种类型的自动递增字段。这回归了我的预期,但有一个明显的问题.10gen建议反对它。
警告通常在MongoDB中,您不会对_id字段或任何字段使用自动增量模式,因为它不适用于具有大量文档的数据库。通常,默认值ObjectId对于_id来说更理想。
请注意粗体文字。 10gen并不建议你增加任何领域。
所以,回到问题所在。如果我给服务器一个帖子标题,我希望它创建一个帖子,我希望它自动将我的标题更改为一个唯一的标题。例如,如果我创建三个标题为foo
的帖子,我希望服务器为/foo
,/foo1
,/foo2
创建网址。虽然,它可以是任何形式的独特添加,但这里的要点是服务器正在处理创建唯一URL的肮脏工作,而不是简单地失败并使用户反复尝试提出一个唯一的URL。
话虽如此,这是如何以“MongoDB方式”完成的? 10gen建议反对递增,基本上我能找到的唯一唯一字符串是ObjectID
,但/foo50bbe1573b60ff0000000002
几乎不“漂亮”。您必须承认,如果您被迫使用/foo50bbe1573b60ff0000000002
,您也可以使用/50bbe1573b60ff0000000002
。在前5个角色之后,“漂亮”已经很久了。
那么,关于如何以MongoDB友好的方式处理这个问题的任何想法/意见?
潜在答案: 一个可怕的解决方案是重复文档创建,直到唯一的传递,但最多X次。例如,
潜在答案: 另一个可能的答案就是做10gen建议反对,做一个增量领域。
在上述两个解决方案中,我确信每种方法在各种方法中都更有效率。例如:如果您的唯一字段很可能是唯一的,那么解决方案1可能是最佳的,例如用户输入数据的40个字符。如果您处理4个字符,它可能会像糖蜜一样慢。
编辑:更好的答案
我认为,两者的结合将是最好的。拥有一组“原始”网址(例如:/foo
),并计算他们被写入的次数。将计数附加到目标网址,并且您有一个唯一的网址。我相信这将是10gen建议的性能问题之间的平衡,同时还会给你增量。
答案 0 :(得分:4)
10gen警告不要使用某种悲观的并发或使用服务器端javascript来查找ENTIRE集合的当前最大密钥,然后递增它并返回新的_id。 MongoDB专为大量集合而设计,通常依赖于fire和忘记插入/更新。根据您所描述的应用程序的性质,这些都不是障碍(比10gen的建议更重要的是您对问题域的了解以及它如何与他们给您发出警告的项目相互作用)。
一个不符合10gen建议的更好的方案是从帖子的其他一些属性构建一个url,即用户名,创建它的日期和时间等。
在您的博客文章示例中,您可能有类似
的网址路径/帖/用户名/三分之二千〇一十三/ 5 /标题-的-MY-交
您必须根据您正在显示的资源的属性来决定实际方案,但这是一个良好的开端。在此示例中,除非单个用户在同一天创建具有完全相同标题的两个帖子,否则确保唯一URL将没有问题。在这种情况下,您的文档可能如下所示:
{ _id:ObjectId(...), userName:“userName”, dateCreated:ISODate(“2013-03-05”), 标题:“我的帖子的标题”, 身体: ”...” }
在{dateCreated: -1, userName: 1, title: 1}
上使用唯一索引(这样可以很好地为用户排序和订购帖子提供帮助)。