如何使用MongoDB构建递归结构

时间:2012-08-04 11:56:02

标签: sql node.js mongodb data-structures recursion

我正在尝试使用SQL做一些通常很简单的事情(例如,在同一个表中使用外键)(对于MongoDB来说可能很容易,我还不知道)这是构建一个递归数据结构

对于这个例子,我将讨论网站中的页面。我想制作一个多级页面结构。所以可能有:

  • 主页
  • 我们的产品
    • 产品1
    • 产品2
  • 关于我们
    • 我们在哪儿?
    • 联系我们

假设网页上有标题和内容。

我需要知道最好的方法是什么,以及如何基于该数据结构构建站点地图(显示每个级别的每个页面的页面)。

我正在使用MongoDB为这种情况构建一个node.js应用程序。

编辑:通过简单地引用每个页面中的父页面,它不会起作用吗?页面就像{ title: 'test', content: 'hello world', parentPage: ObjectID(parent page) }

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我个人会在这里实现一个物化路径结构,使用前缀无大小写不敏感的正则表达式来更新和查询非常容易(这意味着它将使用索引),所以示例如下:

{_id: {}, path: 'about_us/where_are_we'}

正如您所看到的,这也允许SEO友好的URL直接命中这棵树,为您提供最大的权力。这对于您希望显示以下URL的帮助系统非常有用:

/help/how-to-use-my-site

由于how-to-use-my-site可以直接点击路径,或者甚至更进一步,你可以容纳两个字段并直接点击全文,如:

{_id: {}, path: 'about_us/where_are_we', normalised_url: 'where_are_we'}

当然,前面的回答说你必须知道你希望如何访问你的内容,但物化路径在我看来是一个良好的开端。

您可以在此处阅读有关Mongo树结构的更多信息:http://www.mongodb.org/display/DOCS/Trees+in+MongoDB

答案 1 :(得分:1)

您需要知道如何访问数据。

我最后一次使用树结构时,我在Ruby中实现了this(我从各种来源获取灵感),它存储了一个_id路径和完整的uri(slugified页面标题),这是一个痛苦的处理这样的结构。

另一方面,您可以创建集合文档(根)和嵌入文档(分支和叶子)。处理起来比较简单,但查询时必须得到整棵树,只有知道内部文档有多深,才能查询内部文档。

根据我过去的经验,支持树结构的所有工作都不值得(除非是必需的),大多数用户将基于标签而不是固定类别创建松散结构。