Freigeben über


$densify (Aggregation)

Die $densify Phase in einer Aggregationspipeline wird verwendet, um fehlende Datenpunkte innerhalb einer Abfolge von Werten auszufüllen. Sie hilft beim Erstellen eines vollständigeren Datasets, indem fehlende Werte basierend auf einem angegebenen Feld, Bereich und Schritt generiert werden. Dies ist besonders nützlich in Szenarien wie zeitreihenbasierte Datenanalysen, bei denen Lücken in Datenpunkten ausgefüllt werden müssen, um eine genaue Analyse sicherzustellen.

Syntax

{
  $densify: {
    field: <field>,
    range: {
      step: <number>,
      unit: <string>, // Optional, e.g., "hour", "day", "month", etc.
      bounds: [<lowerBound>, <upperBound>] // Optional
    },
    partitionByFields: [<field1>, <field2>, ...] // Optional
  }
}

Die Parameter

Parameter BESCHREIBUNG
field Das Feld, auf dem die Verdichteung ausgeführt wird.
range.step Die Schrittgröße zum Generieren fehlender Werte.
range.unit (Optional) Die Einheit der Schrittgröße, z. B. Zeiteinheiten (z. B. "Stunde", "Tag").
range.bounds (Optional) Gibt den Bereich (untere und obere Begrenzungen) für die Verdichteung an.
partitionByFields (Optional) Felder, die zum Gruppieren von Daten zur Verdichteung verwendet werden.

Beispiele

Beispiel 1: Densify a time-series dataset

Die folgende Pipeline füllt fehlende Tage im Datumsfeld aus:

db.aggregate([
    {
      $documents: [
        { date: new ISODate("2024-01-01"), value: 10 },
        { date: new ISODate("2024-01-03"), value: 15 }
      ]
    },
    {
      $densify: {
        field: "date",
        range: {
          step: 1,
          unit: "day",
          bounds: "full"
        }
      }
    }
  ]);

Diese Abfrage würde das folgende Dokument zurückgeben.

[
  { date: ISODate("2024-01-01T00:00:00.000Z"), value: 10 },
  { date: ISODate("2024-01-02T00:00:00.000Z") },
  { date: ISODate("2024-01-03T00:00:00.000Z"), value: 15 }
]

Beispiel 2: Verweigerung numerischer Daten

Die folgende Pipeline füllt fehlende numerische Werte im sales.fullSales Feld aus:

db.aggregate([
    {
      $documents: [
        { level: 1, score: 10 },
        { level: 3, score: 30 }
      ]
    },
    {
      $densify: {
        field: "level",
        range: {
          step: 1,
          bounds: [1, 5] 
        }
      }
    }
  ]);

Diese Abfrage würde das folgende Dokument zurückgeben.

[
  { level: 1, score: 10 },
  { level: 2 },
  { level: 3, score: 30 },
  { level: 4 }
]

Einschränkungen

In der folgenden Tabelle sind die wichtigsten Einschränkungen und Verhaltensweisen zusammengefasst, die der $densify Phase in MongoDB-Aggregationspipelines zugeordnet sind:

Kategorie Bedingung/Verhalten
Feldeinschränkungen - Fehler, wenn ein Dokument einen Datumswert aufweist und unitnicht angegeben ist.
– Fehler, wenn ein Dokument einen numerischen Wert aufweist und unitangegeben wird.
- Feldname beginnt mit $. Wird $project verwendet, um ihn umzubenennen.
partitionByFields - Jedes Feld wird zu einem Wert ohne Zeichenfolge ausgewertet.
- Feldname beginnt mit $.
range.bounds - Untere Grenze definiert den Startwert unabhängig von vorhandenen Dokumenten.
- Die untere Grenze ist inklusive.
- Obere Grenze ist exklusiv.
- $densify Filtert Dokumente nicht außerhalb der Grenzen aus.