sql >> データベース >  >> NoSQL >> MongoDB

MongoDBでツリー構造を再帰的にクエリする方法は?

    ユースケースに応じて、 MongoDB v3.4 集約パイプライン を提供します $graphLookup という演算子 。集計演算子は、コレクションに対して再帰検索を実行できます。 $graphLookupの定義 で詳細な定義を参照してください 。

    上記のドキュメント階層と値を例として使用して、以下の集計を実行してみることができます。

    db.collectionName.aggregate([
    
                    {$unwind:{
                            path:"$childrenIdList", 
                            preserveNullAndEmptyArrays: true}
                      }, 
                    {$graphLookup:{
                            from:"collectionName", 
                            startWith:"$_id", 
                            connectFromField:"_id", 
                            connectToField:"childrenIdList", 
                            as:"myparents",  
                            restrictSearchWithMatch: {"_id"}}
                      }, 
                    {$match: {"_id": 7 } },
                    {$group:{
                            _id:"$_id", 
                            parents:{$addToSet:"$myparents._id"}
                      }}
    ]);
    

    上記は以下のような結果を返すはずです:

    { "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
    

    そうは言っても、コレクションが大きい場合は、 $ unwind 各ドキュメントで、インデックスを利用できなくなります。他の人が示唆しているように、ドキュメントモデルの構造を再検討する必要があります。 データモデルのツリー構造 を参照してください。 。アプリケーションロジックとクエリのユースケースに基づいて最適化し、柔軟なドキュメントスキーマに従うようにします。




    1. node.js&express-アプリケーション構造のグローバルモジュールとベストプラクティス

    2. mongodbはWindowsで起動できませんか?

    3. マングースはサブサブドキュメントにデータを入力します

    4. MongoEngineは、クエリで読み取り設定を指定します