需求: 根据 设备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 // 按格式化后的日期排序
}
}
]);
结果: