MongoDB聚合运算符:$denseRank

$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 }

相关推荐

  1. MongoDB聚合运算符:$denseRank

    2024-03-12 02:00:04       18 阅读
  2. MongoDB聚合运算符:$denseRank

    2024-03-12 02:00:04       18 阅读
  3. MongoDB聚合运算符:$add

    2024-03-12 02:00:04       34 阅读
  4. MongoDB聚合运算符:$arrayToObject

    2024-03-12 02:00:04       26 阅读
  5. MongoDB聚合运算符;$dateToParts

    2024-03-12 02:00:04       26 阅读
  6. MongoDB聚合运算符:$dayOfWeek

    2024-03-12 02:00:04       28 阅读
  7. MongoDB聚合运算符:$dayOfMonth

    2024-03-12 02:00:04       28 阅读
  8. MongoDB聚合运算符;$dateToString

    2024-03-12 02:00:04       23 阅读
  9. MongoDB聚合运算符:$dayOfYear

    2024-03-12 02:00:04       23 阅读
  10. MongoDB聚合运算符:$dateTrunc

    2024-03-12 02:00:04       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 02:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 02:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 02:00:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 02:00:04       20 阅读

热门阅读

  1. MySQL—数据页的结构和原理

    2024-03-12 02:00:04       16 阅读
  2. HTML二识

    2024-03-12 02:00:04       23 阅读
  3. VUE3+X6流程图实现数据双向绑定的方案

    2024-03-12 02:00:04       21 阅读
  4. 如何远程SSH连接在家的服务器主机

    2024-03-12 02:00:04       22 阅读
  5. SpringBoot项目中同时支持https和http协议

    2024-03-12 02:00:04       24 阅读
  6. 英语听力 3.11

    2024-03-12 02:00:04       20 阅读
  7. vue使用西瓜视频插件xgplayer

    2024-03-12 02:00:04       47 阅读
  8. Leetcode 189. 轮转数组

    2024-03-12 02:00:04       23 阅读
  9. C++split的替代方法

    2024-03-12 02:00:04       23 阅读