$derivative(聚合)
定义
版本 5.0 中的新增功能。
返回指定窗口内的平均变化率,计算公式为:
分子,设置为从最后一个文档的 表达式 值减去第一个文档的数值 表达式 值的结果。
$derivative
仅在$setWindowFields
阶段可用。 使用$setWindowFields
时,必须在 阶段指定一个 窗口$derivative
。
$derivative
事务语法:
{ $derivative: { input: <expression>, unit: <time unit> } }
$derivative
接受包含以下字段的文档:
行为
使用$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秒窗口中返回每辆卡车的平均速度(以英里/小时为单位)。
在以下示例输出中,卡车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 }