Mongodb 如何获取分层文档的子条目之和?

Mongodb 如何获取分层文档的子条目之和?,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,我有以下格式的文件: { 姓名:root1,, 儿童:[{ 姓名:A,, 儿童:[{ 姓名:A1, 项目:20 }, { 姓名:A2, 项目:19 }], 项目:8 }, { 姓名:B,, 项目:12 }], 项目:1 } 也就是说,每个级别都有一个名称字段、一个项目字段和一个可选的子字段。我想运行一个查询,返回每个根目录的项目总数。在本例中,它应该返回,因为20+19+8+12+1=60 {u id:root1,items:60} 但是,每个文档可以有任意多个级别。也就是说,这个示例在根目录下

我有以下格式的文件:

{ 姓名:root1,, 儿童:[{ 姓名:A,, 儿童:[{ 姓名:A1, 项目:20 }, { 姓名:A2, 项目:19 }], 项目:8 }, { 姓名:B,, 项目:12 }], 项目:1 } 也就是说,每个级别都有一个名称字段、一个项目字段和一个可选的子字段。我想运行一个查询,返回每个根目录的项目总数。在本例中,它应该返回,因为20+19+8+12+1=60

{u id:root1,items:60} 但是,每个文档可以有任意多个级别。也就是说,这个示例在根目录下有两到三个子目录,但其他文档可能有更多子目录。也就是说,我不能做这样的事情

db.myCollection.aggregate{$unwind:$children}, {$group:{{u id:$name,items:{$sum:$items}}
什么样的查询可以工作?

使用聚合框架确实无法将数组降低到任意深度。对于这种类型的结构,您需要使用mapReduce,您可以通过编程实现这一点:

db.collection.mapReduce 作用{ var项目=0; var动作=功能电流{ 项目+=当前项目; 如果当前.hasOwnPropertychildren{ current.children.forEachfunctionchild{ 行动儿童; }; } }; 这一行动; 发出此。名称、项目; }, 函数{}, {out:{inline:1}}

如果不需要MapReduce,那么考虑数据的另一种结构,并且做不同的事情:

{name:root1,items:1,path:[],root:null}, {name:A,items:8,path:[root1],root:root1}, {name:A1,items:20,path:[root1,A],root:root1}, {name:A2,items:19,path:[root1,A],root:root1}, {name:B,items:12,path:[root1],root:root1} 那么您只需要一个简单的聚合:

db.collection.aggregate[ {$group:{ _身份证:{ $cond:[ $root, $root, $name ] }, 项目:{$sum:$items} }} ] 因此,如果您采用不同的方法来映射层次结构,那么在不进行递归检查的情况下,执行诸如聚合路径总数之类的操作会容易得多

您需要的方法取决于您的实际使用需求