12

再帰的なツリー構造を保存する必要があります。リンクされたリスト。
したがって、すべてのオブジェクトは同じです。それぞれに親オブジェクトへのポインターがあり、それぞれに子オブジェクトの配列があります。
このような構造を Mongo に保存できますか。
つまり、親オブジェクトの Mongo コレクション。各オブジェクトは、その中に子オブジェクトの Mongo コレクションを保持します。

$a = $MyCollection->findOne(**some conditions)->Childs->find(...)
4

2 に答える 2

7

コレクションをコレクションに格納することはできません。ただし、オブジェクトを参照する ID を他のコレクションに格納することはできます。IDをドキュメントまたは要素に解決する必要があり、その要素にさらにIDが格納されている場合は、それらを何度も解決する必要があります。ドキュメントはリッチで重複するデータであることを意図していますが、ドキュメントでは、埋め込みの代わりに ID を使用できることを説明しています

于 2011-12-17T21:18:19.627 に答える
7

MongoDB はサブドキュメントを保存できます。

Node
{
    "value" : "root"
    "children" : [ { "value" : "child1", "children" : [ ... ] }, 
                   { "value" : "child2", "children" : [ ... ] } ]
}

ただし、ツリー構造やかなり複雑なものにサブドキュメントを使用することはお勧めしません。サブドキュメントは第 1 レベルの市民ではありません。コレクションアイテムではありません。

たとえば、指定された値を持つノードをすばやく見つけられるようにしたいとします。のインデックスをvalue使用すると、検索が高速になります。ただし、値がサブドキュメントにある場合は、コレクション要素の値ではないため、インデックスが作成されません。

したがって、通常はシリアル化を手動で行い、代わりに ID のリストを保存することをお勧めします。

Node 
{
  "_id" : ObjectId("..."),
  "parentId" : ObjectId("..."), // or null, for root
}

それぞれの要素の ID を取得するには、シリアル化の一部を手動で行う必要があります。

ヒント ツリーのブランチ全体を取得したいとします。直接の親 ID のみを保存する代わりに、代わりにすべての祖先 IDを保存できます。

"ancestorIds": [id1, id2, id3]

于 2011-12-17T21:23:23.693 に答える