Definición
Novedad 5.0 en la versión.:
Devuelve la tasa promedio de cambio dentro de la ventana especificada, que se calcula usando:
Primer y último documento en la etapa
$setWindowFieldsventana.
$derivative solo está disponible en la fase $setWindowFields. Debe especificar una ventana en la $setWindowFields etapa al usar $derivative.
$derivative sintaxis:
{ $derivative: { input: <expression>, unit: <time unit> } }
$derivative toma un documento con estos campos:
Campo | Descripción |
|---|---|
Especifica la expresión a evaluar. La expresión debe evaluarse a un número. | |
Comportamiento
Debes especificar una ventana en la etapa $setWindowFields al utilizar $derivative.
Ejemplo
Crea una colección deliveryFleet que contenga las lecturas del odómetro de camiones de entrega registradas en intervalos de 30 segundos:
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 } ] )
Este ejemplo utiliza $derivative en la etapa de $setWindowFields para obtener la velocidad promedio en millas por hora de cada camión, y la etapa de $match para filtrar los resultados a camiones cuya velocidad superó las 50 millas por hora:
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 } } } ] )
En el ejemplo:
La etapa
$setWindowFieldsobtiene la velocidad media en millas por hora de cada camión:partitionBy: "$truckID"particiona los documentos de la colección entruckID.sortBy: { timeStamp: 1 }ordena los documentos de cada partición portimeStampen orden ascendente (1), por lo que la lectura del odómetro más temprana aparece primero.outputestablece el valor derivadomilesen un nuevo campo llamadotruckAverageSpeedusando$derivativeque se ejecuta en una ventana de rango.La expresión de entrada está establecida en
"$miles", que se utiliza en el numerador para el cálculo de la derivada.La
$derivativeunidad se establece en"hour"para el campotimeStamp, que se usa en el denominador para el cálculo de la derivada.La ventana contiene el rango entre un límite inferior de
-30segundos (los 30 segundos anteriores del documento actual en la salida) y0segundos (se corresponde con el valortimeStampdel documento actual en la salida). Esto significa que$derivativedevuelve la velocidad promedio de cada camión en millas por hora en la ventana de 30 segundos.
En la siguiente salida de ejemplo, la velocidad del camión 1 se muestra en el campo truckAverageSpeed. La velocidad del camión 2 no se muestra porque el camión 2 no superó las 50 millas por hora.
{ "_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 }