ネストされたセットを持つモデルツリー構造
Overview
このドキュメントでは、ツリーの可変性を犠牲にしてサブツリーの検出を最適化するツリーのような構造を記述するデータ モデルについて説明します。
パターン
ツリー内の各ノードは、Nested Sets(入れ子集合)のパターンにより、ツリーのラウンドトリップ トラバーサル内で停止点として特定されます。ツリー内の各ノードは、アプリケーションにより、初回トリップ時とリターントリップ時の 2 回訪問されます。Nested Sets(入れ子集合)パターンは、各ツリー ノードをドキュメントに格納します。ドキュメントには、ツリー ノードに加えて、ノードの親の ID、left
フィールドのノードの初期停止、right
フィールドの戻り停止が格納されます。
以下のカテゴリの階層を考慮します。
次の例では、Nested Sets(入れ子集合)を使用してツリーをモデル化します。
db.categories.insertMany( [ { _id: "Books", parent: 0, left: 1, right: 12 }, { _id: "Programming", parent: "Books", left: 2, right: 11 }, { _id: "Languages", parent: "Programming", left: 3, right: 4 }, { _id: "Databases", parent: "Programming", left: 5, right: 10 }, { _id: "MongoDB", parent: "Databases", left: 6, right: 7 }, { _id: "dbm", parent: "Databases", left: 8, right: 9 } ] )
クエリを実行してノードの子孫を検索できます。
var databaseCategory = db.categories.findOne( { _id: "Databases" } ); db.categories.find( { left: { $gt: databaseCategory.left }, right: { $lt: databaseCategory.right } } );
Nested Sets(入れ子集合) パターンは、サブツリーを見つけるための高速で効率的なソリューションを提供しますが、ツリー構造を変更するには非効率的です。したがって、このパターンは変更されない静的ツリーに最適です。