使用MongoDB Aggregation计算多个平均值

我一直负责在一天,一周,一个月和一年中为MongoDB中相当大的一组文档生成平均值。

所有的工作都有一个created领域,我需要基于outputs数组的平均值…

这是一个文件的样子:

 { __v: 0, _id: ObjectId("535837911393fd0200d8e1eb"), created: ISODate("2014-04-23T21:58:41.446Z"), output: [ { ref: { img: false }, type: "image/png", methods: [ { options: { height: 200, width: 200 }, method: "resize" } ] }, { ref: { img: false }, type: "image/png", methods: [ { options: { height: 400, width: 400 }, method: "resize" } ] } ] } 

以下是我目前的脚本:

 JobModel.aggregate([ { $unwind: '$output' }, { $group: { _id: { $dayOfYear: '$created' }, day: { $sum: 1 } } }, { $group: { _id: null, avgDay: { $avg: '$day' } } }, { $project: { _id: 0, average: { day: '$avgDay' } } } ], function(err, data) { if (err) { console.log(err); return; } res.send(data); next(); }); 

我似乎无法找出正确的顺序。 有什么build议么?

真的不知道你在这里之后。 你说你想要“多重”的平均值,但是这提出了“多元”的问题,基于什么? 一天中的平均“输出”条目将不同于每月的平均输出条目,甚至每月的平均输出条目。 因此,每个select的规模都会发生变化,并不是“每日”,“每月”和“每年”

我觉得你真的是“离散的”总数,最好先find输出条目的“大小”,然后应用每个规模的平均值:

 JobModel.aggregate( [ { "$unwind": "$output" }, // Count the array entries on the record { "$group": { "_id": "$_id", "created": { "$first": "$created" }, "count": { "$sum": 1 } }}, // Now get the average per day { "$group": { "_id": { "$dayOfYear": "$created" }, "avg": { "$avg": "$count" } }} ], function(err,result) { } ); 

或者实际上使用MongoDB 2.6和更高版本,您可以在数组上使用$size运算符:

 JobModel.aggregate( [ // Now get the average per day { "$group": { "_id": { "$dayOfYear": "$created" }, "avg": { "$avg": { "$size": "$output" } } }} ], function(err,result) { } ); 

所以合乎逻辑的是运行你所需要的$match范围内的每一个,而不是你的聚合键“日”,“月”或“年”

你可以做一些事情,比如把日平均值与日平均每月平均值相结合,然后把结果与数组相结合,否则你只会丢弃一些项目,如果你只是想“每年的平均日数,但作为完整的结果:

 JobModel.aggregate( [ // Now get the average per day { "$group": { "_id": { "year": { "$year": "$created" }, "month": { "$month": "$created" }, "day": { "$dayOfYear": "$created" } }, "dayAvg": { "$avg": { "$size": "$output" } } }}, // Group for month { "$group": { "_id": { "year": "$_id.year", "month": "$_id.month" }, "days": { "$push": { "day": "$_id.day", "avg": "$dayAvg" } }, "monthAvg": { "$avg": "$dayAvg" } }}, // Group for the year { "$group": { "_id": "$_id.year", "daily": { "$avg": "$monthAvg" }, "months": { "$push": { "month": "$_id.month", "daily": "$monthAvg", "days": "$days" } } }} ], function(err,result) { } ); 

然而,你想要应用这个,但是你的例子中缺less的主要东西是find每个文档的原始“输出”数组的“大小”或“计数”,从中获得平均值。