Menu Docs

$densify (agregaĆ§Ć£o)

$densify

Novidades na versĆ£o 5.1.

Cria novos documentos em uma sequĆŖncia de documentos onde determinados valores em um campo estĆ£o faltando.

VocĆŖ pode usar o $densify para:

  • Preencha lacunas nos dados de sĆ©ries temporais.

  • Adicione valores ausentes entre grupos de dados.

  • Preencha seus dados com um intervalo de valores especificado.

O estƔgio $densify tem esta sintaxe:

{
$densify: {
field: <fieldName>,
partitionByFields: [ <field 1>, <field 2> ... <field n> ],
range: {
step: <number>,
unit: <time unit>,
bounds: < "full" || "partition" > || [ < lower bound >, < upper bound > ]
}
}
}

O estƔgio $densify toma um documento com estes campos:

Campo
necessidade
DescriĆ§Ć£o

ObrigatĆ³rio

O campo para densificar. Os valores do field especificado devem ser todos os valores numƩricos ou todas as datas.

Os documentos que nĆ£o contĆŖm o field especificado continuam pelo pipeline nĆ£o modificado.

Para especificar um <field> em um documento incorporado ou em uma array, use a notaĆ§Ć£o de ponto.

Para restriƧƵes, consulte field RestriƧƵes do.

Opcional

O conjunto de campos para agir como a chave composta para agrupar os documentos. No estĆ”gio, cada grupo de $densify documentos Ć© conhecido como uma partiĆ§Ć£o.

Se vocĆŖ omitir este campo, o utilizarĆ” uma partiĆ§Ć£o para toda a$densify coleĆ§Ć£o.

Para obter um exemplo, consulte DensificaĆ§Ć£o com partiƧƵes.

Para restriƧƵes, consulte partitionByFields RestriƧƵes do.

ObrigatĆ³rio

Um objeto que especifica como os dados sĆ£o densificados.

ObrigatĆ³rio

VocĆŖ pode especificar range.bounds como:

  • An array: [ < lower bound >, < upper bound > ],

  • Uma string: "full" ou "partition".

Se bounds for uma array:

Se bounds for "full":

  • $densify adiciona documentos que abrangem toda a gama de valores do que field estĆ” sendo densificado.

Se bounds for "partition":

  • $densify adiciona documentos a cada partiĆ§Ć£o, semelhante a se vocĆŖ tivesse executado uma full densificaĆ§Ć£o de intervalo de em cada partiĆ§Ć£o individualmente.

ObrigatĆ³rio

O valor para incrementar o valor do campo em cada documento. $densify cria um novo documento para cada step entre os documentos existentes.

Se range.unit for especificado, ostep deverĆ” ser um nĆŗmero inteiro. Caso contrĆ”rio, step pode ser qualquer valor numĆ©rico.

NecessƔrio se o campo for uma data.

A unidade a aplicar ao campo etapa ao incrementar valores de data no campo.

VocĆŖ pode especificar um dos seguintes valores para unit como uma string:

  • millisecond

  • second

  • minute

  • hour

  • day

  • week

  • month

  • quarter

  • year

Para ver um exemplo, consulte Densificar dados de sƩries temporais.

Para documentos que contĆŖm o campo especificado, $densify retornarĆ” um erro se:

  • Qualquer documento na coleĆ§Ć£o tem um valor de field da data do tipo e o campo unidade nĆ£o Ć© especificado.

  • Qualquer documento na coleĆ§Ć£o tem um valor de field do tipo numĆ©rico e o campo unidade Ć© especificado.

  • O nome field comeƧa com $. VocĆŖ deve renomear o campo se quiser densificĆ”-lo. Para renomear campos, use $project.

$densify retornarĆ” um erro se algum nome de campo na array partitionByFields:

  • Avalia para um valor nĆ£o string.

  • ComeƧa com $.

Se range.bounds for uma array:

  • O limite inferior indica o valor inicial para os documentos adicionados, independentemente dos documentos que jĆ” estĆ£o na coleĆ§Ć£o.

  • O limite inferior Ć© inclusivo.

  • O limite superior Ć© exclusivo.

  • $densify nĆ£o filtra documentos com valores de campo fora dos limites especificados.

ObservaĆ§Ć£o

A partir do MongoDB,8.0 $densify trata os limites com um limite inferior e superior iguais como um conjunto vazio e nĆ£o gera um documento com o limite como o valor do campo .

Em versƵes anteriores, trata os limites com um limite inferior e superior iguais como um intervalo fechado e gera um documento com o valor do limite como um valor de campo se a collection ainda nĆ£o contiver um documento com o valor do$densify limite.

Por exemplo, um range.bounds de [10, 10] gera um documento extra com valor de campo 10 nas versƵes anteriores 8.0 a, mas nĆ£o gera esse documento em 8.0 e posterior.

$densify nĆ£o garante a ordem de classificaĆ§Ć£o dos documentos gerados.

Para garantir a ordem de classificaĆ§Ć£o, utilize $sort no campo pelo qual vocĆŖ deseja classificar.

Crie uma coleĆ§Ć£o weather que contenha leituras de temperatura em intervalos de quatro horas.

db.weather.insertMany( [
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-18T00:00:00.000Z"),
"temp": 12
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-18T04:00:00.000Z"),
"temp": 11
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-18T08:00:00.000Z"),
"temp": 11
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-18T12:00:00.000Z"),
"temp": 12
}
] )

Este exemplo utiliza o estƔgio $densify para preencher as lacunas entre os intervalos de quatro horas para obter a granularidade por hora para os pontos de dados:

db.weather.aggregate( [
{
$densify: {
field: "timestamp",
range: {
step: 1,
unit: "hour",
bounds:[ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ]
}
}
}
] )

No exemplo:

  • O estĆ”gio $densify preenche as lacunas de tempo entre as temperaturas registradas.

    • field: "timestamp" densifica o campo timestamp.

    • range:

      • step: 1 aumenta o campo timestamp por unidade 1.

      • unit: hour densifica o campo timestamp por hora.

      • bounds: [ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ] Define o intervalo de tempo que Ć© densificado.

Na saƭda seguinte, o estƔgio $densify preenche as lacunas de tempo entre as horas de 00:00:00 e 08:00:00.

[
{
_id: ObjectId("618c207c63056cfad0ca4309"),
metadata: { sensorId: 5578, type: 'temperature' },
timestamp: ISODate("2021-05-18T00:00:00.000Z"),
temp: 12
},
{ timestamp: ISODate("2021-05-18T01:00:00.000Z") },
{ timestamp: ISODate("2021-05-18T02:00:00.000Z") },
{ timestamp: ISODate("2021-05-18T03:00:00.000Z") },
{
_id: ObjectId("618c207c63056cfad0ca430a"),
metadata: { sensorId: 5578, type: 'temperature' },
timestamp: ISODate("2021-05-18T04:00:00.000Z"),
temp: 11
},
{ timestamp: ISODate("2021-05-18T05:00:00.000Z") },
{ timestamp: ISODate("2021-05-18T06:00:00.000Z") },
{ timestamp: ISODate("2021-05-18T07:00:00.000Z") },
{
_id: ObjectId("618c207c63056cfad0ca430b"),
metadata: { sensorId: 5578, type: 'temperature' },
timestamp: ISODate("2021-05-18T08:00:00.000Z"),
temp: 11
}
{
_id: ObjectId("618c207c63056cfad0ca430c"),
metadata: { sensorId: 5578, type: 'temperature' },
timestamp: ISODate("2021-05-18T12:00:00.000Z"),
temp: 12
}
]

Crie uma coleĆ§Ć£o do coffee que contenha dados para duas variedades de grĆ£os de cafĆ©:

db.coffee.insertMany( [
{
"altitude": 600,
"variety": "Arabica Typica",
"score": 68.3
},
{
"altitude": 750,
"variety": "Arabica Typica",
"score": 69.5
},
{
"altitude": 950,
"variety": "Arabica Typica",
"score": 70.5
},
{
"altitude": 1250,
"variety": "Gesha",
"score": 88.15
},
{
"altitude": 1700,
"variety": "Gesha",
"score": 95.5,
"price": 1029
}
] )

Este exemplo utiliza $densify para densificar o campo altitude para cada cafƩ variety:

db.coffee.aggregate( [
{
$densify: {
field: "altitude",
partitionByFields: [ "variety" ],
range: {
bounds: "full",
step: 200
}
}
}
] )

A agregaĆ§Ć£o de exemplo:

  • PartiƧƵes dos documentos por variety para criar um cluster para Arabica Typica e um para Gesha cafĆ©.

  • Especifica um intervalo do full, significando que os dados sĆ£o densificados ao longo do intervalo completo de documentos existentes para cada partiĆ§Ć£o.

  • Especifica um step de 200, o que significa que novos documentos sĆ£o criados em intervalos de altitude de 200.

A aggregation produz os seguintes documentos:

[
{
_id: ObjectId("618c031814fbe03334480475"),
altitude: 600,
variety: 'Arabica Typica',
score: 68.3
},
{
_id: ObjectId("618c031814fbe03334480476"),
altitude: 750,
variety: 'Arabica Typica',
score: 69.5
},
{ variety: 'Arabica Typica', altitude: 800 },
{
_id: ObjectId("618c031814fbe03334480477"),
altitude: 950,
variety: 'Arabica Typica',
score: 70.5
},
{ variety: 'Gesha', altitude: 600 },
{ variety: 'Gesha', altitude: 800 },
{ variety: 'Gesha', altitude: 1000 },
{ variety: 'Gesha', altitude: 1200 },
{
_id: ObjectId("618c031814fbe03334480478"),
altitude: 1250,
variety: 'Gesha',
score: 88.15
},
{ variety: 'Gesha', altitude: 1400 },
{ variety: 'Gesha', altitude: 1600 },
{
_id: ObjectId("618c031814fbe03334480479"),
altitude: 1700,
variety: 'Gesha',
score: 95.5,
price: 1029
},
{ variety: 'Arabica Typica', altitude: 1000 },
{ variety: 'Arabica Typica', altitude: 1200 },
{ variety: 'Arabica Typica', altitude: 1400 },
{ variety: 'Arabica Typica', altitude: 1600 }
]

Esta imagem exibe os documentos criados com $densify:

Estado da coleĆ§Ć£o de cafĆ© apĆ³s densificaĆ§Ć£o completa
clique para ampliar
  • Os quadrados mais escuros representam os documentos originais na coleĆ§Ć£o.

  • Os quadrados mais claros representam os documentos criados com $densify.

Este exemplo utiliza $densify para somente densificar lacunas no campo altitude dentro de cada variety:

db.coffee.aggregate( [
{
$densify: {
field: "altitude",
partitionByFields: [ "variety" ],
range: {
bounds: "partition",
step: 200
}
}
}
] )

A agregaĆ§Ć£o de exemplo:

  • PartiƧƵes dos documentos por variety para criar um cluster para Arabica Typica e um para Gesha cafĆ©.

  • Especifica um intervalo partition, significando que os dados sĆ£o densificados dentro de cada partiĆ§Ć£o.

    • Para a partiĆ§Ć£o Arabica Typica, o intervalo Ć© 600-950.

    • Para a partiĆ§Ć£o Gesha, o intervalo Ć© 1250-1700.

  • Especifica um step de 200, o que significa que novos documentos sĆ£o criados em intervalos de altitude de 200.

A aggregation produz os seguintes documentos:

[
{
_id: ObjectId("618c031814fbe03334480475"),
altitude: 600,
variety: 'Arabica Typica',
score: 68.3
},
{
_id: ObjectId("618c031814fbe03334480476"),
altitude: 750,
variety: 'Arabica Typica',
score: 69.5
},
{ variety: 'Arabica Typica', altitude: 800 },
{
_id: ObjectId("618c031814fbe03334480477"),
altitude: 950,
variety: 'Arabica Typica',
score: 70.5
},
{
_id: ObjectId("618c031814fbe03334480478"),
altitude: 1250,
variety: 'Gesha',
score: 88.15
},
{ variety: 'Gesha', altitude: 1450 },
{ variety: 'Gesha', altitude: 1650 },
{
_id: ObjectId("618c031814fbe03334480479"),
altitude: 1700,
variety: 'Gesha',
score: 95.5,
price: 1029
}
]

Esta imagem exibe os documentos criados com $densify:

Estado da coleĆ§Ć£o de cafĆ© apĆ³s densificaĆ§Ć£o da faixa de partiĆ§Ć£o
clique para ampliar
  • Os quadrados mais escuros representam os documentos originais na coleĆ§Ć£o.

  • Os quadrados mais claros representam os documentos criados com $densify.