【发布时间】:2020-03-04 11:00:45
【问题描述】:
我有一个包含 50 万数据的集合,我想要输入日期之间所有月份的平均值。现在我正在获取全年的数据,但我希望它按月分隔,即每个月有 12 个数据范围。
下面是我正在使用的聚合管道。
let filter = 'y';
const date = new Date();
let checkDate = moment().subtract(1.5, 'years')._d;
MeterData.aggregate([
{
$group: {
_id: "$meter_id",
// total: { $sum: 1 },
totalEnergy: filter !== 'a' ? {
$sum: {
$toDouble: {
$cond: {
if: {
$gte: [
"$date", checkDate
]
},
then: "$energy.Energy",
else: 0
}
}
}
} : { $sum: { $toDouble:
"$energy.Energy"
} }
},
}
]);
在这里,我在 totalEnergy 字段中获得了全年的 totalEnergy,但现在我想要 totalEnergy 加上我输入年份的月度计算。 关于如何做到这一点的任何想法。 ?
以下是集合中的示例文档。
{"_id":{"$oid":"5e557779ed588826d84cef11"},
"meter_id":"1001",
"date":{"$date":{"$numberLong":"1509474600000"}},
"parameter_name":"hvac","voltage":{"unit":"V"},
"current":{"unit":"AMP"},
"powerFactor":{"unit":"phi"},
"angle":{"unit":"degree"},
"activePower":{"unit":"kwh"},
"reactivePower":{"unit":"kwh"},
"apparentPower":{"unit":"kwh"},
"frequency":{"unit":"hz"},
"thd":{"unit":"percentage"},
"energy":{"Energy":"5.7"},
"power":{"unit":"watt"},
根据 Ryan Gunner 的建议,我得到了我的答案,我将其粘贴在下面,我还有一个问题。
[
{
meter_id: '1001',
month: '2017-10',
totalEnergy: 0,
averageEnergy: 0
} + 11 more months......
]
现在我需要的是 12 个月的总能量。例如,单个变量中所有 12 个月的 totalEnergy 字段的总数。
【问题讨论】:
-
添加 2 个新字段是否可行:月、年? ...计算您现有数据的日期字段 - 并添加到您的应用程序的架构中,以便为新记录输入它们...。这将使事情变得更容易和更快地运行......如果你要经常重复这个查询,那将是一个值得的努力......
-
我认为你最好使用方法
toDate()而不是_d属性,它可能仅供moment内部使用。 -
@WernfriedDomscheit 我肯定会改变的