祖先の配列を持つモデルツリー構造
Overview
このページでは、親ノードへの参照とすべての祖先ノードを保存する配列を使用して、MongoDB ドキュメント内のツリーのような構造を記述するデータモデルについて説明します。
パターン
祖先の配列パターンは、各ツリー ノードをドキュメントに保存します。ツリー ノードに加えて、ドキュメントはノードの祖先またはパスの ID を配列に保存します。
以下のカテゴリの階層を考慮します。
次の例では、 祖先の配列 を使用してツリーをモデル化します。 これらのドキュメントには ancestors
フィールドに加えて、 parent
フィールドにすぐの親カテゴリへの参照も保存されます。
db.categories.insertMany( [ { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" }, { _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" }, { _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" }, { _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" }, { _id: "Programming", ancestors: [ "Books" ], parent: "Books" }, { _id: "Books", ancestors: [ ], parent: null } ] )
ノードの祖先またはパスを検索するクエリは高速で簡単です。
db.categories.findOne( { _id: "MongoDB" } ).ancestors フィールド
ancestors
にインデックスを作成すると、祖先ノードによる高速検索を有効にできます。db.categories.createIndex( { ancestors: 1 } ) フィールド
ancestors
でクエリを実行すると、その子孫がすべて検索できます。db.categories.find( { ancestors: "Programming" } )
祖先の配列パターンは、祖先フィールドの要素にインデックスを作成することで、ノードの子孫と祖先を検索するための高速で効率的なソリューションを提供します。 これにより、祖先の配列はサブツリーを操作するのに適した選択になります。
祖先の配列パターンはマテリアライズド パスパターンよりもわずかに遅くなりますが、より簡単に使用できます。