MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Besoin de conseils sur la recherche globale mongo pour compter les sous-nœuds dans tous les nœuds enfants pour chaque nœud

Obtenez les données de test de ceci Lien MongoPlaygroud.

REMARQUE  :Vous pouvez ignorer tous les $sort étapes dans le lien ci-dessus pour des raisons de performance.

Requête pour obtenir le nombre de feuilles :

db.Forests.aggregate([
    { $unwind: "$trees" },
    { $unwind: "$trees.branches" },
    {
        $lookup: {
            from: "Leaves",
            localField: "trees.branches.branch_id",
            foreignField: "branch_id",
            as: "trees.branches.leaves"
        }
    },
    {
        $addFields: {
            "trees.branches.leaf_count": { $size: "$trees.branches.leaves" }
        }
    },
    {
        $project: { "trees.branches.leaves": 0 }
    },
    {
        $group: {
            _id: {
                forest_id: "$forest_id",
                tree_id: "$trees.tree_id"
            },
            leaf_count: { $sum: "$trees.branches.leaf_count" },
            branches: { $push: "$trees.branches" }
        }
    },
    {
        $group: {
            _id: "$_id.forest_id",
            leaf_count: { $sum: "$leaf_count" },
            trees: {
                $push: {
                    leaf_count: { $sum: "$leaf_count" },
                    tree_id: "$_id.tree_id",
                    branches: "$branches"
                }
            }
        }
    },
    {
        $group: {
            _id: null,
            leaf_count: { $sum: "$leaf_count" },
            forests: {
                $push: {
                    leaf_count: { $sum: "$leaf_count" },
                    forest_id: "$_id",
                    trees: "$trees"
                }
            }
        }
    },
    {
        $project: { _id: 0 }
    }
])

Sortie :

{
    "leaf_count" : 4,
    "forests" : [
        {
            "leaf_count" : 3,
            "forest_id" : "forestA",
            "trees" : [
                {
                    "leaf_count" : 2,
                    "tree_id" : "treeA",
                    "branches" : [
                        {
                            "branch_id" : "branchA",
                            "leaf_count" : 1
                        },
                        {
                            "branch_id" : "branchA1",
                            "leaf_count" : 1
                        },
                        {
                            "branch_id" : "branchA2",
                            "leaf_count" : 0
                        }
                    ]
                },
                {
                    "leaf_count" : 1,
                    "tree_id" : "treeB",
                    "branches" : [
                        {
                            "branch_id" : "branchB",
                            "leaf_count" : 1
                        }
                    ]
                }
            ]
        },
        {
            "leaf_count" : 1,
            "forest_id" : "forestB",
            "trees" : [
                {
                    "leaf_count" : 1,
                    "tree_id" : "treeC",
                    "branches" : [
                        {
                            "branch_id" : "branchC",
                            "leaf_count" : 1
                        }
                    ]
                },
                {
                    "leaf_count" : 0,
                    "tree_id" : "treeD",
                    "branches" : [
                        {
                            "branch_id" : "branchD",
                            "leaf_count" : 0
                        }
                    ]
                }
            ]
        },
        {
            "leaf_count" : 0,
            "forest_id" : "forestC",
            "trees" : [
                {
                    "leaf_count" : 0,
                    "tree_id" : "treeE",
                    "branches" : [
                        {
                            "branch_id" : "branchE",
                            "leaf_count" : 0
                        }
                    ]
                }
            ]
        }
    ]
}