Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual 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 leva um documento com estes campos:

Campo
necessidade
Descrição
Campo
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 Restrições dofield .

Opcional

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

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

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

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

Obrigatório

Um objeto que especifica como os dados são densificados.

Obrigatório

Você pode especificar range.bounds como:

  • Uma 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 gama 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 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, erros do $densify 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 erros 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 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-900.

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

← $currentOp (agregação)