Mongodb 需要有关mongo聚合查找的指导,以便为每个节点计算所有子节点中的子节点

Mongodb 需要有关mongo聚合查找的指导,以便为每个节点计算所有子节点中的子节点,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,为了更好地理解我的问题,我创建了一个假想的场景,在各个层次上计算森林中的树叶 我需要提供所有森林、每片森林、每棵树和每根树枝的树叶总数。因此,我需要输出一个树结构,其中包含所有这些信息以及每个元素的ID,以便能够识别它们 输入数据来自两个集合-森林和树叶。我需要在branch_id上连接林和叶,输出叶计数,并将这些计数注入到与林集合等效的结构中(作为查询结果-不存储在数据库中)。内存使用是一个问题。我想我可以做一个连接并将所有这些ID读入内存,但可能有多达100个森林。每个森林可能有多达10棵树

为了更好地理解我的问题,我创建了一个假想的场景,在各个层次上计算森林中的树叶

我需要提供所有森林、每片森林、每棵树和每根树枝的树叶总数。因此,我需要输出一个树结构,其中包含所有这些信息以及每个元素的ID,以便能够识别它们

输入数据来自两个集合-森林和树叶。我需要在branch_id上连接林和叶,输出叶计数,并将这些计数注入到与林集合等效的结构中(作为查询结果-不存储在数据库中)。内存使用是一个问题。我想我可以做一个连接并将所有这些ID读入内存,但可能有多达100个森林。每个森林可能有多达10棵树,每棵树有大约25根树枝,每根树枝有多达15片叶子

Forests collection
[
    {
        forest_id: 'forestA',
        trees: [
            {
                tree_id: 'treeA',
                branches: [
                    {
                         branch_id: 'branchA',
                    }
                ]
            }
        ]
    }
]

Leaves collection
[
    {
        leaf_id: 'leafA',
        branch_id: 'branchA'
    }
]
这是所需的输出:

{
    leaf_count: 9999999999,
    forests: [
       {
            leaf_count: 8888888,
            forest_id: 'forestA',
            trees: [
                {
                    leaf_count: 77777,
                    tree_id: 'treeA',
                    branches: [
                        {
                            leaf_count: 6666,
                            branch_id
                        }
                    ]
                }
            ]
        }
    ]
}
我正在处理的聚合管道中包含所有所需的输出(到目前为止),没有任何计数。我想我需要在这里使用方面,我担心性能,我正在寻找我应该学习的东西来正确处理这个问题。任何指导都将不胜感激。谢谢

从MongoPlayGround链接获取测试数据

注意:为了提高性能,您可以跳过上述链接中的所有
$sort
阶段

查询以获取假期数:

db.Forests.aggregate([
{$REWIND:“$trees”},
{$unwind:“$trees.branchs”},
{
$lookup:{
来自:“树叶”,
localField:“trees.branchs.branch\u id”,
foreignField:“分支机构id”,
as:“树、树枝、树叶”
}
},
{
$addFields:{
“trees.branchs.leaf_count:{$size:$trees.branchs.leaves”}
}
},
{
$project:{“trees.branchs.leaves”:0}
},
{
$group:{
_身份证:{
林id:“$FREST_id”,
树id:“$trees.tree\u id”
},
叶数:{$sum:$trees.branchs.leaf_count},
分支:{$push:“$trees.branchs”}
}
},
{
$group:{
_id:“$\u id.forest\u id”,
叶数:{$sum:$leaf_count},
树木:{
$push:{
叶数:{$sum:$leaf_count},
树id:“$\u id.tree\u id”,
分行:“$分行”
}
}
}
},
{
$group:{
_id:null,
叶数:{$sum:$leaf_count},
森林:{
$push:{
叶数:{$sum:$leaf_count},
林id:“$\u id”,
树木:“$trees”
}
}
}
},
{
$project:{u id:0}
}
])
输出:

{
“叶数”:4,
“森林”:[
{
“叶数”:3,
“森林id”:“森林A”,
“树木”:[
{
“叶数”:2,
“tree_id”:“treeA”,
“分支机构”:[
{
“分行id”:“分行”,
“叶数”:1
},
{
“分行id”:“分行1”,
“叶数”:1
},
{
“分行id”:“分行2”,
“叶数”:0
}
]
},
{
“叶数”:1,
“树id”:“树B”,
“分支机构”:[
{
“分行id”:“分行HB”,
“叶数”:1
}
]
}
]
},
{
“叶数”:1,
“森林id”:“森林B”,
“树木”:[
{
“叶数”:1,
“tree_id”:“treeC”,
“分支机构”:[
{
“分行id”:“分行HC”,
“叶数”:1
}
]
},
{
“叶数”:0,
“tree_id”:“treeD”,
“分支机构”:[
{
“分行id”:“分行id”,
“叶数”:0
}
]
}
]
},
{
“叶数”:0,
“森林id”:“森林C”,
“树木”:[
{
“叶数”:0,
“树id”:“树”,
“分支机构”:[
{
“分行id”:“分行”,
“叶数”:0
}
]
}
]
}
]
}

WOW!你的答案中有那么多内容需要我去理解和消化!非常感谢你!我将用今晚剩下的时间来消化这个!嗯,我只是想给你买杯咖啡,但网站不起作用…:-(You.are.awesome.Thank!查看MongoDB提供的这两门课程:&免费,会对您有所帮助。谢谢,我会在有机会的时候查看这些课程!我可以问一下-如果输入稍有不同怎么办?您没有收到森林数组,而是有这样一个对象:{“森林”:[常用数组],“引用”:{some object}?我这样问是因为我描述的输入非常接近我在中间阶段的输入