マテリアライズドパスを持つモデルツリー構造
Overview
このページでは、ドキュメント間の完全な関係パスを保存することで、MongoDB ドキュメント内のツリーのような構造を記述するデータモデルについて説明します。
パターン
マテリアライズドパスパターンは、各ツリーノードをドキュメントに保存します。ツリー ノードに加えて、ドキュメントにはノードの祖先またはパスの ID が string として保存されます。 マテリアライズドパスパターンでは、文字列や正規表現を操作する追加のステップが必要ですが、このパターンはパスを操作する際の柔軟性も提供します(部分的なパスによってノードを検索するなど)。
以下のカテゴリの階層を考慮します。
次の例では、 マテリアライズド パス を使用してツリーをモデル化し、フィールド {0path
にパスを保存します。パスstring では、区切り文字としてコンマ,
が使用されています。
db.categories.insertMany( [ { _id: "Books", path: null }, { _id: "Programming", path: ",Books," }, { _id: "Databases", path: ",Books,Programming," }, { _id: "Languages", path: ",Books,Programming," }, { _id: "MongoDB", path: ",Books,Programming,Databases," }, { _id: "dbm", path: ",Books,Programming,Databases," } ] )
フィールド
path
でソートしてツリー全体を検索するクエリを実行できます。db.categories.find().sort( { path: 1 } ) path
フィールドで正規表現を使用して、Programming
の子孫を検索できます。db.categories.find( { path: /,Programming,/ } ) また、
Books
が階層の最上位にあるBooks
の子孫を検索することもできます。db.categories.find( { path: /^,Books,/ } ) フィールド
path
にインデックスを作成するには、次の呼び出しを使用します。db.categories.createIndex( { path: 1 } ) このインデックスにより、クエリによってはパフォーマンスが向上する場合があります。
ルート
Books
サブツリー(例:/^,Books,/
または/^,Books,Programming,/
)の場合、path
フィールドのインデックスを使用するとクエリのパフォーマンスが大幅に向上します。ルートからのパスがクエリに提供されていないサブツリーのクエリ(例:
/,Databases,/
)、またはサブツリーの同様のクエリでは、ノードは インデックスされたstringの中央にある可能性があり、クエリはインデックス全体を検査する必要があります。これらのクエリでは、インデックスがコレクション全体よりも大幅に小さい場合、インデックスによってパフォーマンスがいくらか向上する可能性があります。