2012-08-04 3 views
1

J'essaie de faire quelque chose de simple avec SQL (avec une clé étrangère dans la même table par exemple) (ça peut être aussi facile avec MongoDB, je ne sais pas encore) qui est de construire une structure de données récursive.Comment construire une structure récursive avec MongoDB

Pour cet exemple, je parlerai de Pages sur un site Web. J'aimerais créer une structure de page à plusieurs niveaux. Donc, il pourrait y avoir:

  • Accueil
  • Nos produits
    • Produit 1
    • Produit 2
  • A propos de nous
    • Où sommes-nous?
    • Contactez-nous

Disons que les pages auraient un titre et un contenu.

J'ai besoin de savoir quelle est la meilleure façon de faire cela, et aussi comment je pourrais construire un sitemap basé sur cette structure de données (page qui montre chaque page de chaque niveau).

Je construis une application node.js avec MongoDB pour ce cas.

EDIT: Cela ne fonctionnerait-il pas simplement en référençant une page parente dans chaque page? Les pages seraient comme { title: 'test', content: 'hello world', parentPage: ObjectID(parent page) }

Merci pour l'aide!

Répondre

1

Vous aurez besoin de savoir comment vous voulez accéder à vos données. La dernière fois que j'ai utilisé une structure arborescente, j'ai implémenté this (je me suis inspiré de diverses sources) dans Ruby, il stocke un chemin _id et l'uri complet (titres de page slugifiés), c'est difficile de gérer des structures comme ce. De l'autre côté, vous pouvez créer une collection de documents (racines) et de documents incorporés (branches et feuilles). Il est plus simple à manipuler mais vous devrez obtenir l'arbre entier lors de l'interrogation, et vous ne pourrez interroger les documents internes que si vous savez à quelle profondeur il se trouve. De mes expériences passées, tout le travail pour supporter une structure en arbre ne vaut pas la chandelle (à moins que ce soit une exigence), la plupart des utilisateurs créeront une structure lâche basée plus sur des balises que sur des catégories fixes.

+0

Je pensais à des balises ou une autre sorte de catégorisation, mais je me demandais encore comment vais-je imiter les niveaux de cette façon? Merci pour votre réponse! – TomShreds

3

Personnellement, je utiliser une structure de chemins matérialisés ici, il est très facile de mettre à jour et requête en utilisant préfixé aucun cas regexs insensible (ce qui signifie qu'il utilisera un index), donc un exemple ressemblerait à ceci:

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

Ceci aussi, comme vous pouvez le voir, permet aux URL conviviales SEO de frapper directement sur cet arbre en vous donnant une puissance maximale.Ceci est particulièrement utile dans les systèmes d'aide où vous souhaitez afficher une URL comme:

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

Depuis how-to-use-my-site peut frapper directement sur le chemin ou même futher vous pouvez loger deux champs et cliquez directement sur le texte intégral comme:

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

Bien sûr, comme la réponse précédente a dit que vous devez savoir comment vous souhaitez accéder à votre contenu, mais les chemins matérialisés sont un bon début à mon avis.

Vous pouvez en savoir plus sur les structures d'arbres à Mongo ici: http://www.mongodb.org/display/DOCS/Trees+in+MongoDB

Questions connexes