gpt4 book ai didi

javascript - 使用 MongoDB 聚合计算多个平均值

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:30 25 4
gpt4 key购买 nike

我的任务是为 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();

});

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

最佳答案

真的不太确定你在这里追求什么。您说您想要“多重”平均值,但这提出了“多重”的基础是什么?一天的平均“输出”条目将不同于每月的平均输出条目,甚至不同于每月的每日平均输出条目。因此,比例会随着每次选择而变化,并不是真正的“每日”、“每月”和“每年”的单个查询

我认为您确实是“离散”总计,最好的方法是首先找到输出条目的“大小”,然后应用每个比例的平均值:

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) {

}
);

但是您想应用它,但您的示例中缺少的主要内容是找到每个文档的原始“输出”数组的“大小”或“计数”,从中获取平均值。

关于javascript - 使用 MongoDB 聚合计算多个平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24356940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com