文档菜单
文档首页
/
MongoDB 手册
/ / /

$derivative (聚合)

在本页

  • 定义
  • 行为
  • 示例

版本中5.0.

$derivative

返回指定窗口内的平均变化率,该窗口使用

  • $setWindowFields阶段计算的

  • 分子,设置为第一个文档的数值表达式值减去最后一个文档的数值表达式值。

  • 分母,设置为第一份文档的 sortBy 字段值减去最后一份文档的 sortBy 字段值。

$derivative 只在 $setWindowFields 阶段可用。在使用 $derivative 时,必须在 $setWindowFields 阶段指定一个 window

$derivative 语法

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

$derivative 语法接受包含以下字段的文档

字段
描述

指定要评估的表达式。该表达式必须评估为数字。

指定时间单位的字符串。使用以下字符串之一

  • "week"

  • "day"

  • "hour"

  • "minute"

  • "second"

  • "millisecond"

如果 sortBy 字段不是日期,则必须省略 unit。如果指定了 unit,则必须在 sortBy 字段中指定一个日期。

在使用 $derivative 时,必须在 window 阶段指定一个 $setWindowFields

创建一个包含在30秒间隔记录的送货卡车里程表的deliveryFleet集合

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 以升序(1)排序,因此最早的车载里程表读数是第一个。

    • output 设置在新的字段 truckAverageSpeed 中使用 $derivative,该 $derivative 在一个 范围 窗口中运行。

      • 设置 输入 表达式为 "$miles",它在导数计算中使用为分子。

      • $derivative单位 设置为 "hour",用于导数计算的分母中的 timeStamp 字段。

      • 窗口包含从下限 -30 秒(输出中当前文档之前30秒)到 0 秒(与输出中当前文档的 timeStamp 值匹配)的范围。这意味着 $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 }

返回

$denseRank