mogodb 按时间段分组统计 平均值/差值

需求: 根据 设备id 和 时间段 进行分组统计

1.表结构:
在这里插入图片描述

2.统计平均值

db.device_appinfo_smartelectricitymeter.aggregate([
    {
        $match: {
            "deviceid": {
                $in: ["1796108760998432770", "1796108761602412545"]
            },
            "updatetime": {
                $gt: 1733414400000,
                $lte: 1734105599000
            }
        }
    },
     {
        $project: {
            deviceid: 1,
            updatetime: 1,
            electricquantity: { $toDouble: "$electricquantity" }, // 提前转换为数字
            voltageofphasec: { $toDouble: "$voltageofphasec" }, // 提前转换为数字
                        timeInterval: {
                    $floor: { 
                        $divide: [
                            { $toLong: "$updatetime" }, // 将 updatetime 转换为长整型
                            86400 * 1000 // 将秒转换为毫秒
                        ]
                    }
            }
        }
    },
    {
        $group: {
            _id: {
                deviceid: "$deviceid", // 将 deviceid 作为分组的一部分
                timeInterval: "$timeInterval"
            },
            electricquantity: {
                $avg: "$electricquantity" // 将字符串转换为数字并计算平均值
            },
            voltageofphasec: {
                $avg: "$voltageofphasec" // 计算 voltageofphasec 的平均值
            }
        }
    },
    {
        $project: {
            "_id": 0,
            "deviceid": "$_id.deviceid", // 提取 deviceid        
            "electricquantity": 1,
            "voltageofphasec": 1, // 保留 voltageofphasec 的平均值
                                    
             "formattedDate": {
                $dateToString: {
                    format: "%Y-%m-%d %H:%M:%S",                         // 格式化为 yyyy-mm-dd HH:mm:ss
                    date: {                                         
                          // 将时间戳转换为日期
                          $toDate: { $multiply: ["$_id.timeInterval", 86400 * 1000] }                                        
                   }             
                }
            }                                            
        }
    },
    {
        $sort: {
            "formattedDate": 1 // 按格式化后的日期排序
        }
    }
]);

结果:
在这里插入图片描述

3.统计差值

db.device_appinfo_smartelectricitymeter.aggregate([
    {
        $match: {
            "deviceid": {
                $in: ["1796108762768429057", "1796108762407718913"]
            },
            "updatetime": {
                $gt: 1733414400000,
                $lte: 1734105599000
            }
        }
    },
		{
        $project: {
            deviceid: 1,
            updatetime: 1,
            electricquantity: { $toDouble: "$electricquantity" }, // 提前转换为数字
            voltageofphasec: { $toDouble: "$voltageofphasec" }, // 提前转换为数字
            timeInterval: {
                    $floor: { 
                        $divide: [
                            { $toLong: "$updatetime" }, // 将 updatetime 转换为长整型
                            86400 * 1000 // 将秒转换为毫秒
                        ]
                    }
            }
        }
    },
    {
        $group: {
            _id: {
                deviceid: "$deviceid", // 将 deviceid 作为分组的一部分
                timeInterval: "$timeInterval"
            },
            maxElectricQuantity: { $max: "$electricquantity" }, // 获取最大值
            minElectricQuantity: { $min: "$electricquantity" }, // 获取最小值
            maxVoltageOfPhaseC: { $max: "$voltageofphasec" }, // 获取最大值
            minVoltageOfPhaseC: { $min: "$voltageofphasec" } // 获取最小值
        }
    },
    {
        $project: {
            "_id": 0,
            "deviceid": "$_id.deviceid", // 提取 deviceid
            "electricquantity": { $subtract: ["$maxElectricQuantity", "$minElectricQuantity"] }, // 计算 electricquantity 的差值
            "voltageofphasec": { $subtract: ["$maxVoltageOfPhaseC", "$minVoltageOfPhaseC"] }, // 计算 voltageofphasec 的差值
						"formattedDate": {
                $dateToString: {
                    format: "%Y-%m-%d %H:%M:%S", // 格式化为 yyyy-mm-dd HH:mm:ss
                    date: {                                         
                          // 将时间戳转换为日期
                          $toDate: { $multiply: ["$_id.timeInterval", 86400 * 1000] }                                        
                   }   
                }
            }
        }
    },
    {
        $sort: {
            "formattedDate": 1 // 按格式化后的日期排序
        }
    }
]);

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值