Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 带循环的Mongo Db聚合管道_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 带循环的Mongo Db聚合管道

Node.js 带循环的Mongo Db聚合管道,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个包含50万数据的集合,我想要输入日期之间所有月份的平均值。现在我得到的是全年的数据,但我希望它按一个月分开,即每个月12个数据范围 下面是我正在使用的聚合管道 let filter = 'y'; const date = new Date(); let checkDate = moment().subtract(1.5, 'years')._d; MeterData.aggregate([ { $group: { _id: "$

我有一个包含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"
                   } }
          },
               }
  ]);
在这里,我得到全年的总能量,在总能量场中,但现在我想要总能量加上我输入年份的每月计算。 你知道怎么做吗

下面是该集合中的示例文档

{"_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个月的总能量场的总和。

类似的情况如何

var startDate=新的ISODate('2020-04-01');
var endDate=新的ISO日期('2019-04-01');
db.collection.aggregate(
{
$match:{
$expr:{
美元及:[
{$gt:['$date',endDate]},
{$lt:['$date',startDate]}]
}
}
},
{
$group:{
_身份证:{
仪表:“$meter_id”,
月份:{$dateToString:{格式:'%Y-%m',日期:'$date'}
},
总能量:{$sum:{$toDouble:'$energy.energy'},
平均能量:{$avg:{$toDouble:'$energy.energy'}
}
},
{
$项目:{
仪表id:“$仪表id.meter”,
月份:“$\u id.month”,
totalEnergy:“$totalEnergy”,
averageEnergy:“$averageEnergy”,
_身份证号码:0
}
},
{
$sort:{meter_id:1}
}
{
$group:{
_id:null,
grandTotalEnergy:{$sum:'$totalEnergy'},
月数据:{$push:'$$ROOT'}
}
},
{$project:{{u id:0}}
)

更新:添加了grandTotalEnergy字段并将monthlyData推送到一个数组。

您是否可以添加两个新字段:月、年。。。计算出现有数据的日期字段,并将其添加到应用程序的架构中,以便输入新记录…。这将使运行起来更容易、更快……如果您要经常重复此查询,这将是一项值得努力的工作……我认为您最好使用method
toDate()
而不是
\u d
属性,该属性可能仅用于
时刻的内部使用。@wernfrieddomsc帮助我确定我会更改它谢谢!这是完美的工作,但只剩下一件事,我没有得到预期的。我已经编辑了这个问题,你能检查一下并回复吗?谢谢。!很棒的解决方案。