2017-01-15 5 views
0

こんにちは私は以下の形式でNoSQLにフォルダツリー構造を保存しています。mongodbのリーフノードのルートまですべての階層親を取得

Document{{_id=587bedc1da0847d7ad8b7056, name=firstlevel, parent_folder=null}} 
Document{{_id=587beddcda0847d7ad8b7057, name=secondlevel, parent_folder=firstlevel}} 
Document{{_id=587bedf2da0847d7ad8b7058, name=thirdlevel, parent_folder=secondlevel}} 

私は私の出力がfirstlevelsecondlevelthirdlevel(私はすでに私は午前どのレベル知っているように、オプション)の両方で構成する必要がありthirdlevelの親を取得する必要があります。誰かが私に従う必要があるモデルツリー構造の種類を教えてもらえますか、それとも親、子、先祖、パスなどのモデルツリー構造なしで行うことができますか?

ありがとうございます。

答えて

2

現在のMongo 3.4バージョンでは、$graphLookupを使用できます。

次のようなものがある場合は、

{ 
    "_id": ObjectId("587bedc1da0847d7ad8b7056"), 
    "name": "firstlevel", 
    "parent_folder": null 
} { 
    "_id": ObjectId("587beddcda0847d7ad8b7057"), 
    "name": "secondlevel", 
    "parent_folder": "firstlevel" 
} { 
    "_id": ObjectId("587bedf2da0847d7ad8b7058"), 
    "name": "thirdlevel", 
    "parent_folder": "secondlevel" 
} 

すべての親を照会します。

db.nodes.aggregate([{ 
    $graphLookup: { 
     from: "nodes", 
     startWith: "$name", 
     connectFromField: "parent_folder", 
     connectToField: "name", 
     as: "parents", 
    } 
}]); 

thirdlevel

{$match:{name:"thirdlevel"}} 

サンプル出力を照会する親のためのマッチのステージを追加します。

{ 
    "name": "thirdlevel", 
    "parents": [{ 
     "_id": ObjectId("587beddcda0847d7ad8b7057"), 
     "name": "secondlevel", 
     "parent_folder": "firstlevel" 
    }, { 
     "_id": ObjectId("587bedc1da0847d7ad8b7056"), 
     "name": "firstlevel", 
     "parent_folder": null 
    }, { 
     "_id": ObjectId("587bedf2da0847d7ad8b7058"), 
     "name": "thirdlevel", 
     "parent_folder": "secondlevel" 
    }] 
} 
関連する問題