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::class) */ private $comments = []; // ...}/** @EmbeddedDocument */class Comment{ /** @Field(type="string") */ private $by; /** @Field(type="string") */ private $text; /** @EmbedMany(targetDocument=Comment::class) */ private $replies = []; // ...}
Retrieve a blog post and only select the first 10 comments:
<?php$post = $dm->createQueryBuilder(BlogPost::class) ->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::class) * @Index */ private $parent; // ...}
Query for children by a specific parent id:
<?php$children = $dm->createQueryBuilder(Category::class) ->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::class) * @Index */ private $children = []; // ...}
Query for immediate children of a category:
<?php$category = $dm->createQueryBuilder(Category::class) ->field('id')->equals('theid') ->getQuery() ->getSingleResult();$children = $category->getChildren();
Query for immediate parent of a category:
<?php$parent = $dm->createQueryBuilder(Category::class) ->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::class) * @Index */ private $ancestors = []; /** * @ReferenceOne(targetDocument=Category::class) * @Index */ private $parent; // ...}/** @EmbeddedDocument */class SubCategory extends BaseCategory{}
Query for all descendants of a category:
<?php$categories = $dm->createQueryBuilder(Category::class) ->field('ancestors.id')->equals('theid') ->getQuery() ->execute();
Query for all ancestors of a category:
<?php$category = $dm->createQuery(Category::class) ->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::class) ->sort('path', 'asc') ->getQuery() ->execute();
Query for the node 'b' and all its descendants:
<?php$categories = $dm->createQuery(Category::class) ->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.
