You are browsing a version that is no longer maintained.

Trees

MongoDB lends itself quite well to storing hierarchical data. This chapter will demonstrate some examples!

Full Tree in Single Document

<?php/** @Document */class BlogPost{    /** @Id */    private $id;    /** @Field(type="string") */    private $title;    /** @Field(type="string") */    private $body;    /** @EmbedMany(targetDocument="Comment") */    private $comments = array();    // ...}/** @EmbeddedDocument */class Comment{    /** @Field(type="string") */    private $by;    /** @Field(type="string") */    private $text;    /** @EmbedMany(targetDocument="Comment") */    private $replies = array();    // ...}

Retrieve a blog post and only select the first 10 comments:

<?php$post = $dm->createQueryBuilder('BlogPost')    ->selectSlice('replies', 0, 10)    ->getQuery()    ->getSingleResult();$replies = $post->getReplies();

You can read more about this pattern on the MongoDB documentation page "Trees in MongoDB" in the Full Tree in Single Document section.

Parent Reference

<?php/** @Document */class Category{    /** @Id */    private $id;    /** @Field(type="string") */    private $name;    /**     * @ReferenceOne(targetDocument="Category")     * @Index     */    private $parent;    // ...}

Query for children by a specific parent id:

<?php$children = $dm->createQueryBuilder('Category')    ->field('parent.id')->equals('theid')    ->getQuery()    ->execute();

You can read more about this pattern on the MongoDB documentation page "Trees in MongoDB" in the Parent Links section.

Child Reference

<?php/** @Document */class Category{    /** @Id */    private $id;    /** @Field(type="string") */    private $name;    /**     * @ReferenceMany(targetDocument="Category")     * @Index     */    private $children = array();    // ...}

Query for immediate children of a category:

<?php$category = $dm->createQueryBuilder('Category')    ->field('id')->equals('theid')    ->getQuery()    ->getSingleResult();$children = $category->getChildren();

Query for immediate parent of a category:

<?php$parent = $dm->createQueryBuilder('Category')    ->field('children.id')->equals('theid')    ->getQuery()    ->getSingleResult();

You can read more about this pattern on the MongoDB documentation page "Trees in MongoDB" in the Child Links section.

Array of Ancestors

<?php/** @MappedSuperclass */class BaseCategory{    /** @Field(type="string") */    private $name;    // ...}/** @Document */class Category extends BaseCategory{    /** @Id */    private $id;    /**     * @ReferenceMany(targetDocument="Category")     * @Index     */    private $ancestors = array();    /**     * @ReferenceOne(targetDocument="Category")     * @Index     */    private $parent;    // ...}/** @EmbeddedDocument */class SubCategory extends BaseCategory{}

Query for all descendants of a category:

<?php$categories = $dm->createQueryBuilder('Category')    ->field('ancestors.id')->equals('theid')    ->getQuery()    ->execute();

Query for all ancestors of a category:

<?php$category = $dm->createQuery('Category')    ->field('id')->equals('theid')    ->getQuery()    ->getSingleResult();$ancestors = $category->getAncestors();

You can read more about this pattern on the MongoDB documentation page "Trees in MongoDB" in the Array of Ancestors section.

Materialized Paths

<?php/** @Document */class Category{    /** @Id */    private $id;    /** @Field(type="string") */    private $name;    /** @Field(type="string") */    private $path;    // ...}

Query for the entire tree:

<?php$categories = $dm->createQuery('Category')    ->sort('path', 'asc')    ->getQuery()    ->execute();

Query for the node 'b' and all its descendants:

<?php$categories = $dm->createQuery('Category')    ->field('path')->equals('/^a,b,/')    ->getQuery()    ->execute();

You can read more about this pattern on the MongoDB documentation page "Trees in MongoDB" in the Materialized Paths (Full Path in Each Node) section.