私は任意の木構造を持っています。
データ構造の例:
root
|--node1
| |--node2
| | |--leaf1
| |
| |--leaf2
|
|--node3
|--leaf3
各ノードとリーフには、 と の 2 つのプロパティがid
ありname
ます。
重要なクエリ:
1.:
リーフ ID が与えられます。クエリは、ルートからそのリーフまでのパス全体を、すべてのノードid
とname
プロパティとともに返す必要があります。
戻り値がノードの並べ替えられた配列であるか、ノードがネストされているオブジェクトであるかは重要ではありません。
例:id
ofが指定されている場合leaf2
、クエリは次を返す必要がありますroot(id, name), node1(id, name), leaf2(id, name)
。
2.:
与えられた任意のノードid
: (サブ) ツリー全体を取得します。ここでは、各ノードがchildren
配列を持つ単一のオブジェクトを取得すると便利です。
思考、試行錯誤:
1.:
最初は単純にツリーを単一の JSON ドキュメントとしてモデル化しようとしましたが、そうするとクエリが不可能になり、リーフがどのネスト レベルにあるかを調べる方法がありません。また、ルートからリーフまでの s のパス全体がわかっている場合はid
、複数の位置演算子を含むプロジェクションを使用する必要があり、現時点では MongoDB ではサポートされていません。ids
さらに、ネストが無限になる可能性があるため、リーフにインデックスを付けることはできません。
2.:
次のアイデアは、各ノードがノードの祖先を含む配列を持つフラットなデータ設計を使用することでしたids
:
{
id: ...,
name: ...,
ancestors: [ rootId, node1Id, ... ]
}
この方法では、ルートからノードまたはリーフまでのパス全体を取得するために、2 つのクエリを実行する必要があります。これは非常に優れています。
質問:
データ モデルを選択した場合2.
: ツリー全体またはサブツリーを取得するにはどうすればよいですか?
すべての子孫を取得するのは簡単です: find({ancestors:"myStartingNodeId"})
. しかし、それらはもちろんソートまたはネストされません。
この問題を解決するために、集計フレームワークまたはまったく異なるデータ モデルを使用する方法はありますか?
ありがとうございました!