Docs 菜单

Docs 主页开发应用程序MongoDB Manual

$derivative(聚合)

在此页面上

  • 定义
  • 行为
  • 例子

版本 5.0 中的新增功能

$derivative

返回指定window内的平均变化率,计算公式为:

$derivative仅在 阶段可用。使用 时,必须在$setWindowFields 阶段指定一个 窗口 $setWindowFields$derivative

$derivative 事务语法:

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

$derivative 接受包含这些字段的文档:

字段
说明
输入

指定要计算的表达式。该表达式的计算结果必须为数字。

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

  • "week"

  • "day"

  • "hour"

  • "minute"

  • "second"

  • "millisecond"

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

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

创建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 }
] )

此示例在$derivative $setWindowFields阶段使用 获取每辆卡车的平均速度(以英里/小时为单位),并在$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对collection中的文档进行分区

    • sortBy: { timeStamp: 1 }timeStamp以升序 ( 1 ) 对每个分区中的文档进行排序,因此最早的里程表读数位于最前面。

    • output 使用在 范围 $derivative窗口中运行的 miles在名为 的新字段中设置 导数值。truckAverageSpeed

      • 输入表达式设置为"$miles" ,用于导数计算的分子。

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

      • 窗口包含下限-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(聚合)

在此页面上