用mongoose计数嵌套的数组

我在一个node.js应用程序中通过mongoose使用mongoDB。

在我的分贝,我有这个一般的格式:

图书:

BookSchema = { variousData, //Books contain pages pages: [{type: pageSchema}] } 

页数:

 pageSchema = { variousData, //Pages contain frames frames: [frameSchema] } 

框架:

 frameSchema = { variousData } 

我想写一个计数查询,将计算所有书籍中所有页面的总帧数。

所以,如果我有我的数据库中的这个内容:

  Book1 = { data:data, pages: [ {data:data, frames: [frame1,frame2,frame3] }, {data:data, frames: [frame1,frame2,frame3] }, {data:data, frames: [frame1,frame2,frame3] } ] } 

  Book2 = { data:data, pages: [ {data:data, frames: [frame1,frame2] }, {data:data, frames: [frame1,frame2] }, {data:data, frames: [frame1,frame2] } ] } 

我期望得到15的最终结果(第1册9帧,第2册6帧)

我所有的尝试都以错误结束。

我可以写一个循环,但我觉得mongoose会有更好的select。

有什么build议么?

谢谢大家!

最有效的方法是这样的:

  Book.aggregate([ { "$project": { "pages": { "$map": { "input": "$pages", "as": "page", "in": { "$size": "$$page.frames" } }} }}, { "$unwind": "$pages" }, { "$group": { "_id": null, "pages": { "$sum": "$pages" } }} ],function(err,results) { }) 

基本上, $map操作符允许你遍历“pages”数组的元素,查看每个“frames”数组并返回$size 。 现在“pages”的内容只是每个“frames”的大小数组,因此也就是count。

那么你真正需要做的就是“加在一起”。 所以你$unwind数组,并$sum每个帧的所有页面计数加上一个$group