Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$derivative (agregação)

Nesta página

  • Definição
  • Comportamento
  • Exemplo

Novidades na versão 5,0.

$derivative

Retorna a taxa média de alteração dentro da janela especificada, que é calculada usando:

  • Primeiro e último documentos na $setWindowFields janela de estágio .

  • Numerador, que é definido como o resultado da subtração do valor da expressão numérica do primeiro documento do valor da expressão do último documento.

  • Denonado, que é definido como o resultado da subtração do valor do campo sortBy do primeiro documento do valor do campo sortBy do último documento.

$derivative está disponível somente no estágio $setWindowFields . Você deve especificar uma janela no estágio $setWindowFields ao usar $derivative.

$derivative sintaxe:

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

$derivative aceita um documento com estes campos:

Campo
Descrição
Entrada

Especifica a expressão para avaliar. A expressão deve avaliar para um número.

Um string que especifica a unidade de tempo. Use uma destas strings:

  • "week"

  • "day"

  • "hour"

  • "minute"

  • "second"

  • "millisecond"

Se o campo sortBy não for uma data, você deverá omitir um unit. Se você especificar um unit, você deverá especificar uma data no campo sortBy .

Você deve especificar uma janela no estágio $setWindowFields ao usar $derivative.

Crie uma coleção deliveryFleet que contenha leituras de odômetro para caminhoes de entrega registrados em 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 exemplo usa $derivative no estágio $setWindowFields para obter a velocidade média em milhas por hora para cada caminhão, e o estágio $match para filtrar os resultados para caminhonetes cuja velocidade excedeu 50 milhas 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
}
}
}
] )

No exemplo:

  • O estágio $setWindowFields obtém a velocidade média em milhas por hora para cada caminhão:

    • partitionBy: "$truckID" particiona os documentos na coleção por truckID.

    • sortBy: { timeStamp: 1 } classifica os documentos em cada partição por timeStamp em ordem crescente (1), de modo que a leitura mais antiga do odômetro seja a primeira.

    • output define o valor derivado miles em um novo campo chamado truckAverageSpeed usando $derivative que é executado em uma janela de faixa .

      • A expressão de entrada é definida como "$miles", que é usada no numerador para o cálculo da derivada.

      • A $derivative unidade é definida "hour" como para o timeStamp campo , que é usado no denominador para o cálculo da derivada.

      • A janela contém o intervalo entre um limite inferior de -30 segundos (os 30 segundos anteriores do documento atual na saída) e 0 segundos (corresponde ao valor timeStamp do documento atual na saída). Isso significa que $derivative retorna a velocidade média de cada caminhão em milhas por hora na segunda janela 30 .

  • O estágio $match usa o operador maior que $gt para filtrar os resultados para caminhonetes cuja velocidade exceda 80 quilômetros por hora.

No exemplo de saída a seguir, a velocidade do caminhão 1 é mostrada no campo truckAverageSpeed . A velocidade do caminhão 2 não é mostrada porque o caminhão 2 não excedeu 80 quilômetros 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 }
← $denseRank (agregação)