当前位置: 首页 > news >正文

MongoDB聚合运算符:$derivative

$derivative聚合运算符返回返回指定窗口内的平均变化率(即求导),变化率使用以下公式计算:

  • $setWindowFields阶段窗口中的第一个和最后一个文件。
  • 分子,等于最后一个文档的表达式的值减去第一个文档表达式的值。
  • 分母,等于最后一个文档sortBy字段值减去第一个文档sortBy字段值。

语法

{$derivative: {input: <expression>,unit: <time unit>}
}

参数说明:

  • <expression> 指定要指定的表达式,表达式必须要能被解析为数值
  • unit 字符串,用于指定时间单位,可以是:weekdayhourminutesecondmillisecond。如果sortBy字段不是日期类型,就必须忽略unit,换而言之,如果指定了unit,那么sortBy就必须是日期类型字段。

使用

$derivative只能用于$setWindowFields阶段,而且必须指定一个窗口。

举例

使用下面的脚本创建deliveryFleet集合,其内容是以30秒为间隔的送货卡车的里程表读数:

db.deliveryFleet.insertMany( [{ truckID: "1", timeStamp: new Date( "2020-05-18T14:10:30Z" ), miles: 1295.1 },{ truckID: "1", timeStamp: new Date( "2020-05-18T14:11:00Z" ), miles: 1295.63 },{ truckID: "1", timeStamp: new Date( "2020-05-18T14:11:30Z" ), miles: 1296.25 },{ truckID: "1", timeStamp: new Date( "2020-05-18T14:12:00Z" ), miles: 1296.76 },{ truckID: "2", timeStamp: new Date( "2020-05-18T14:10:30Z" ), miles: 10234.1 },{ truckID: "2", timeStamp: new Date( "2020-05-18T14:11:00Z" ), miles: 10234.33 },{ truckID: "2", timeStamp: new Date( "2020-05-18T14:11:30Z" ), miles: 10234.73 },{ truckID: "2", timeStamp: new Date( "2020-05-18T14:12:00Z" ), miles: 10235.13 }
] )

本例在$setWindowFields阶段使用$derivative获得每辆卡车的平均车速,单位是英里/小时,并且使用$match阶段过滤掉车速小于50英里/每小时的卡车。

db.deliveryFleet.aggregate( [{$setWindowFields: {partitionBy: "$truckID",sortBy: { timeStamp: 1 },output: {truckAverageSpeed: {$derivative: {input: "$miles",unit: "hour"},window: {range: [ -30, 0 ],unit: "second"}}}}},{$match: {truckAverageSpeed: {$gt: 50}}}
] )

在本例中:

  • $setWindowFields阶段获取每辆卡车每小时英里数的平均车速:
    • partitionBy: "$truckID"根据truckID对集合文档进行分区
    • sortBy:{timeStamp:1}根据timeStamp字段对文档进行正向排序,最早的里程表读数排在最前面
    • output在窗口范围内使用$derivativemailes的导数值赋予新的字段truckAverageSpeed
      • input表达式为$miles,作为求导计算的分子
      • $derivativetimeStamp字段指定了"hour"为单位,作为求导计算的分母
      • 窗口包含了下限-30秒(前30秒的文档)和0秒(当前文档的时间戳)之间的范围。这意味着$derivative返回卡车在30秒窗口中的速度(英里/小时)。
  • $match阶段使用大于运算符$gt筛选出平均速度大于50英里每小时的卡车。

在下面的输出中可以看出,卡车1的速度显示在truckAverageSpeed字段,卡车2的速度没有显示,因为卡车2的速度未超过50英里每小时

{ "_id" : ObjectId("60cb8a7e833dfeadc8e6285c"), "truckID" : "1","timeStamp" : ISODate("2020-05-18T14:11:00Z"), "miles" : 1295.63,"truckAverageSpeed" : 63.60000000002401 }
{ "_id" : ObjectId("60cb8a7e833dfeadc8e6285d"), "truckID" : "1","timeStamp" : ISODate("2020-05-18T14:11:30Z"), "miles" : 1296.25,"truckAverageSpeed" : 74.3999999999869 }
{ "_id" : ObjectId("60cb8a7e833dfeadc8e6285e"), "truckID" : "1","timeStamp" : ISODate("2020-05-18T14:12:00Z"), "miles" : 1296.76,"truckAverageSpeed" : 61.199999999998916 }
http://www.lryc.cn/news/317009.html

相关文章:

  • 面试官:如果你现在有20个Spring Boot微服务,如何监视所有这些Spring Boot微服务?
  • 冯诺依曼模型
  • 高低拖延个体的任务决策及执行差异
  • 数据分析Pandas专栏---第十三章<Pandas训练题(初)>
  • Delete `␍`eslint(prettier/prettier) 错误的解决方案
  • 第3周 Python字典、集合刷题
  • 文字校对的首选——爱校对:用户真实反馈汇编
  • Llama-3即将发布:Meta公布其庞大的AI算力集群
  • 【JAVA】Date、LocalDate、LocalDateTime 详解,实践应用
  • 分布式链路追踪(一)SkyWalking(1)介绍与安装
  • 蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛
  • SCAU 8580 合并链表
  • Docker安装Gitlab
  • 浅淡 C++ 与 C++ 入门
  • 学习和认知的四个阶段,以及学习方法分享
  • Python编程从入门到实践中的一些误区
  • Kanebo HITECLOTH 高科技擦镜布介绍
  • 政务云安全风险分析与解决思路探讨
  • Linux tcpdump抓包转Wireshark 分析
  • 【Spring高级】Aware与InitializingBean接口
  • 打造你的HTML5打地鼠游戏:零基础入门教程
  • C++默认构造函数/拷贝构造函数/赋值构造函数
  • 前端框架的发展历史介绍
  • Linux 基本命令
  • 怎么查看电脑是不是固态硬盘?简单几个步骤判断
  • 在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
  • 指数函数与三角函数乘积的积分公式
  • 代码随想录算法训练营第五九天 | 下一个更大元素II、接雨水
  • LeetCode(力扣)算法题_2864_最大二进制奇数
  • 食药物质创新 赋能中式滋补健康产业发展交流会圆满结束