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

Mongodb$graphLookupビルド階層

    以下の解決策は、私の過去の回答の1つとほぼ同じであるため、ここで

    db.projects.aggregate([
        {
            $graphLookup: {
                from: "projects",
                startWith: "$_id",
                connectFromField: "_id",
                connectToField: "parent",
                as: "children",
                maxDepth: 4,
                depthField: "level"
            }
        },
        {
            $unwind: "$children"
        },
        {
            $sort: { "children.level": -1 }
        },
        {
            $group: {
                _id: "$_id",
                children: { $push: "$children" }
            }
        },
        {
            $addFields: {
                children: {
                    $reduce: {
                        input: "$children",
                        initialValue: {
                            currentLevel: -1,
                            currentLevelProjects: [],
                            previousLevelProjects: []
                        },
                        in: {
                            $let: {
                                vars: {
                                    prev: { 
                                        $cond: [ 
                                            { $eq: [ "$$value.currentLevel", "$$this.level" ] }, 
                                            "$$value.previousLevelProjects", 
                                            "$$value.currentLevelProjects" 
                                        ] 
                                    },
                                    current: { 
                                        $cond: [ 
                                            { $eq: [ "$$value.currentLevel", "$$this.level" ] }, 
                                            "$$value.currentLevelProjects", 
                                            [] 
                                        ] 
                                    }
                                },
                                in: {
                                    currentLevel: "$$this.level",
                                    previousLevelProjects: "$$prev",
                                    currentLevelProjects: {
                                        $concatArrays: [
                                            "$$current", 
                                            [
                                                { $mergeObjects: [ 
                                                    "$$this", 
                                                    { children: { $filter: { input: "$$prev", as: "e", cond: { $eq: [ "$$e.parent", "$$this._id"  ] } } } } 
                                                ] }
                                            ]
                                        ]
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        {
            $addFields: { children: "$children.currentLevelProjects" }
        },
        {
            $match: {
                _id: "1"
            }
        }
    ])
    

    最後の段階はフィルタリングであると想定されているため、ここで任意のレベルの深度のデータを取得できます。




    1. Docker [Errno 111]接続呼び出しが失敗しました( '127.0.0.1'、6379)

    2. MongoDBまたはCouchDB-本番環境に適していますか?

    3. MongoDbのアップサート辞書

    4. Mirthはmongodb接続に接続します