$derivative (聚合)
定义
新版本中5.0.
返回指定窗口内的平均变化率,该窗口使用
在
$setWindowFields
阶段计算的分子,设置为第一个文档的数值表达式值减去最后一个文档的数值表达式值。
$derivative
只在 $setWindowFields
阶段可用。在使用 $derivative
时,必须在 $setWindowFields
阶段指定一个 window。
$derivative
语法
{ $derivative: { input: <expression>, unit: <time unit> } }
$derivative
语法接受包含以下字段的文档
行为
在使用 $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 }