$densify (agregaĆ§Ć£o)
DefiniĆ§Ć£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.
Sintaxe
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 Os documentos que nĆ£o contĆŖm o Para especificar um Para restriƧƵes, consulte | |
Opcional | O conjunto de campos para agir como a chave composta para agrupar os documentos. No estĆ”gio, cada grupo de Se vocĆŖ omitir este campo, o utilizarĆ” uma partiĆ§Ć£o para toda a Para obter um exemplo, consulte DensificaĆ§Ć£o com partiƧƵes. Para restriƧƵes, consulte | |
ObrigatĆ³rio | Um objeto que especifica como os dados sĆ£o densificados. | |
ObrigatĆ³rio | VocĆŖ pode especificar
Se
Se
Se
| |
ObrigatĆ³rio | O valor para incrementar o valor do campo em cada documento. Se range.unit for especificado, o | |
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
Para ver um exemplo, consulte Densificar dados de sƩries temporais. |
Comportamento e restriƧƵes
field
RestriƧƵes
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
.
partitionByFields
RestriƧƵes
$densify
retornarĆ” um erro se algum nome de campo na array partitionByFields:
Avalia para um valor nĆ£o string.
ComeƧa com
$
.
range.bounds
Comportamento
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.
Ordem de saĆda
$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.
Exemplos
Densificar dados de sƩrie temporal
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 campotimestamp
.range:
step: 1
aumenta o campotimestamp
por unidade 1.unit: hour
densifica o campotimestamp
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 } ]
DensificaĆ§Ć£o com divisĆ³rias
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 } ] )
Densifique toda a gama de valores
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 paraArabica Typica
e um paraGesha
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
de200
, o que significa que novos documentos sĆ£o criados em intervalos dealtitude
de200
.
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
:

Os quadrados mais escuros representam os documentos originais na coleĆ§Ć£o.
Os quadrados mais claros representam os documentos criados com
$densify
.
Densificar valores dentro de cada peƧa
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 paraArabica Typica
e um paraGesha
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
de200
, o que significa que novos documentos sĆ£o criados em intervalos dealtitude
de200
.
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
:

Os quadrados mais escuros representam os documentos originais na coleĆ§Ć£o.
Os quadrados mais claros representam os documentos criados com
$densify
.