MongoDB聚合运算符:$integral

文章目录

$integral聚合运算符只能用在$setWindowField阶段,返回曲线下面积的近似值,该曲线是使用梯形规则计算的,其中每组相邻文档使用以下公式形成一个梯形:

  • $setWindowFields阶段中用于积分间隔的sortBy字段值
  • $integralinput字段表达式用于Y轴的值

语法

js 复制代码
{
   $integral: {
      input: <expression>,
      unit: <time unit>
   }
}

$integral的参数说明

  • input,数值类型的表达式
  • unit,指定时间单位的字符串,可以是:"week""day""hour""minute""second""millisecond"。如果sortBy字段不是日期类型,必须省略单位,如果指定了单位,就必须确保sortBy字段为日期类型

使用

如果省略窗口,则使用具有无界上限和下限的默认窗口。

举例

使用下面的脚本创建powerConsumption集合,包含仪表设备每隔 30 秒测量一次的用电量(以千瓦为单位):

js 复制代码
db.powerConsumption.insertMany( [
   { powerMeterID: "1", timeStamp: new Date( "2020-05-18T14:10:30Z" ),
     kilowatts: 2.95 },
   { powerMeterID: "1", timeStamp: new Date( "2020-05-18T14:11:00Z" ),
     kilowatts: 2.7 },
   { powerMeterID: "1", timeStamp: new Date( "2020-05-18T14:11:30Z" ),
     kilowatts: 2.6 },
   { powerMeterID: "1", timeStamp: new Date( "2020-05-18T14:12:00Z" ),
     kilowatts: 2.98 },
   { powerMeterID: "2", timeStamp: new Date( "2020-05-18T14:10:30Z" ),
     kilowatts: 2.5 },
   { powerMeterID: "2", timeStamp: new Date( "2020-05-18T14:11:00Z" ),
     kilowatts: 2.25 },
   { powerMeterID: "2", timeStamp: new Date( "2020-05-18T14:11:30Z" ),
     kilowatts: 2.75 },
   { powerMeterID: "2", timeStamp: new Date( "2020-05-18T14:12:00Z" ),
     kilowatts: 2.82 }
] )

下面的例子在$setWindowFields阶段使用$integral输出每个仪表装置测量的能耗(千瓦时):

js 复制代码
db.powerConsumption.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$powerMeterID",
         sortBy: { timeStamp: 1 },
         output: {
            powerMeterKilowattHours: {
               $integral: {
                  input: "$kilowatts",
                  unit: "hour"
               },
               window: {
                  range: [ "unbounded", "current" ],
                  unit: "hour"
               }
            }
         }
      }
   }
] )

在本例中:

  • partitionBy: "$powerMeterID"对集合中的文档按照powerMeterID分区。
  • sortBy: { timeStamp: 1 }对分区内的文档按照timeStamp从小到大进行排序,最早的timeStamp排在最前面。
  • output使用$integral将一个区域窗口的kilowatts积分值放到新字段powerMeterKilowattHours
    • input表达式为$kilowatts,用于积分计算的Y轴值
    • $integral unittimeStamp的积分单位设置为hour小时,$integral返回千瓦时的能源消耗
    • 窗口在输出中包含了无下限到当前文档。这意味着$integral返回从分区开头(每个电表的分区中的第一个数据点)到输出中当前文档的时间戳的文档的总千瓦时能耗。

在本例输出中,电表1和2测量的能耗显示在powerMeterKilowattHours字段中:

json 复制代码
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62863"), "powerMeterID" : "1",
  "timeStamp" : ISODate("2020-05-18T14:10:30Z"), "kilowatts" : 2.95,
  "powerMeterKilowattHours" : 0 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62864"), "powerMeterID" : "1",
  "timeStamp" : ISODate("2020-05-18T14:11:00Z"), "kilowatts" : 2.7,
  "powerMeterKilowattHours" : 0.023541666666666666 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62865"), "powerMeterID" : "1",
  "timeStamp" : ISODate("2020-05-18T14:11:30Z"), "kilowatts" : 2.6,
  "powerMeterKilowattHours" : 0.045625 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62866"), "powerMeterID" : "1",
  "timeStamp" : ISODate("2020-05-18T14:12:00Z"), "kilowatts" : 2.98,
  "powerMeterKilowattHours" : 0.068875 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62867"), "powerMeterID" : "2",
  "timeStamp" : ISODate("2020-05-18T14:10:30Z"), "kilowatts" : 2.5,
  "powerMeterKilowattHours" : 0 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62868"), "powerMeterID" : "2",
  "timeStamp" : ISODate("2020-05-18T14:11:00Z"), "kilowatts" : 2.25,
  "powerMeterKilowattHours" : 0.019791666666666666 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e62869"), "powerMeterID" : "2",
  "timeStamp" : ISODate("2020-05-18T14:11:30Z"), "kilowatts" : 2.75,
  "powerMeterKilowattHours" : 0.040625 }
{ "_id" : ObjectId("60cbdc3f833dfeadc8e6286a"), "powerMeterID" : "2",
  "timeStamp" : ISODate("2020-05-18T14:12:00Z"), "kilowatts" : 2.82,
  "powerMeterKilowattHours" : 0.06383333333333334 }
相关推荐
这个DBA有点耶43 分钟前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
刃神太酷啦1 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
小雷信息医学1 小时前
不会写复杂代码也能发 SCI?手把手教你用 InSpireR 交互系统一键提取、合并与导出临床科研宽表【第三章】
数据库
旺仔不是程序员1 小时前
复合索引最左前缀原则:PostgreSQL 的 WHERE 为什么必须命中第一列
数据库·后端·sql
旺仔不是程序员2 小时前
字段类型不一致:PostgreSQL 报错与索引失效的第一元凶
数据库·后端·sql
白远山2 小时前
货运跑腿搬家平台开发实战:从需求分析到落地部署指南
数据库·数据挖掘·需求分析
geovindu2 小时前
sql: Data Modeling Patterns
数据库·sql·设计模式·sqlserver
上海蓝色星球2 小时前
蓝色星球NG-AIOS新型AI工业操作系统重磅发布——以本体智能为内核,重构“AI+制造“新范式
大数据·数据库·人工智能·机器人
瀚高PG实验室2 小时前
瀚高数据库如何克隆表
数据库·sql·postgresql·瀚高数据库
雨辰AI2 小时前
信创多租户项目 9 大踩坑|数据隔离失效、权限越权终极解决(金仓 / 达梦 / 高斯全库适配)
java·大数据·数据库·后端