/
model-tree-structures-with-child-references.txt
71 lines (49 loc) · 2.01 KB
/
model-tree-structures-with-child-references.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
===========================================
Model Tree Structures with Child References
===========================================
.. default-domain:: mongodb
.. contents:: On this page
:local:
:backlinks: none
:depth: 1
:class: singlecol
Overview
--------
This page describes a data model that describes a tree-like structure
in MongoDB documents by storing :ref:`references
<data-modeling-referencing>` in the parent-nodes to children nodes.
Pattern
-------
.. start-model-tree-structures-include-here
The *Child References* pattern stores each tree node in a document; in
addition to the tree node, document stores in an array the id(s) of the
node's children.
Consider the following hierarchy of categories:
.. include:: /images/data-model-tree.rst
The following example models the tree using *Child References*, storing
the reference to the node's children in the field ``children``:
.. code-block:: javascript
db.categories.insertMany( [
{ _id: "MongoDB", children: [] },
{ _id: "dbm", children: [] },
{ _id: "Databases", children: [ "MongoDB", "dbm" ] },
{ _id: "Languages", children: [] },
{ _id: "Programming", children: [ "Databases", "Languages" ] },
{ _id: "Books", children: [ "Programming" ] }
] )
- The query to retrieve the immediate children of a node is fast and
straightforward:
.. code-block:: javascript
db.categories.findOne( { _id: "Databases" } ).children
- You can create an index on the field ``children`` to enable fast
search by the child nodes:
.. code-block:: javascript
db.categories.createIndex( { children: 1 } )
- You can query for a node in the ``children`` field to find its parent
node as well as its siblings:
.. code-block:: javascript
db.categories.find( { children: "MongoDB" } )
The *Child References* pattern provides a suitable solution to tree storage
as long as no operations on subtrees are necessary. This pattern may
also provide a suitable solution for storing graphs where a node may
have multiple parents.