Docs Menu
Docs Home
/
MongoDB マニュアル
/ / /

マテリアライズドパスを持つモデルツリー構造

項目一覧

  • 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の中央にある可能性があり、クエリはインデックス全体を検査する必要があります。

      これらのクエリでは、インデックスがコレクション全体よりも大幅に小さい場合、インデックスによってパフォーマンスがいくらか向上する可能性があります。

戻る

祖先の配列