Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$densify (agregação)

Nesta página

  • Definição
  • Sintaxe
  • Comportamento e restrições
  • Exemplos
$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 notação de ponto de ponto.

Para restrições, consulte field Restrições.

Opcional

O conjunto de campos para agir como a chave composta para agrupar os documentos. Na etapa $densify, cada grupo de documentos é conhecido como uma partição.

Se você omitir este campo, o $densify utilizará uma partição a coleção inteira.

Para obter um exemplo, consulte Densificação com partições.

Para restrições, consulte partitionByFields Restrições.

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:

  • $densify adiciona documentos abrangendo o intervalo de valores dentro dos limites especificados.

  • O tipo de dados para os limites deve corresponder ao tipo de dados no campo sendo densificado.

  • Para obter detalhes sobre o comportamento, consulte range.bounds Comportamento.

Se bounds for "full":

  • $densify adiciona documentos que abrangem toda a faixa de valores do field que está sendo densificado.

Se bounds for "partition":

  • $densify adiciona documentos a cada partição, semelhante a se você tivesse executado uma densificação de intervalo de full 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, o step 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.

$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.

Voltar

$operação atual