Zum Hauptinhalt springen

Aggregation Pipeline

  • Methode, um grosse Anzahl verschiedener Dokumente einer Collection zu bearbeiten und auszuwerten
  • Bearbeitung und Auswertung verschiedener Dokumente einer Collection
  • Aneinanderreihung/Durchlauf verschiedener Stages

MongoDB Aggregation Framework

MongoDB Docs - Aggregation Reference

Begriffe

Aggregation

  • Analyse und Zusammenfassung von Daten

Stage

  • Aggregation-Operation, ausgeführt auf den Daten

Aggregation Pipeline

  • Ausführung mehrerer Stages geordnet hintereinander

Syntax

db.<collection>.aggregate(
{ <stage> }
)
db.<collection>.aggregate( [
{ <stage> },
{ <stage> },
...
] )

Operatoren

MongoDB Docs - Aggregation Operator

Stages

Stages/Einzeloperationen

  • werden aneinandergereiht
  • jede Stage bearbeitet die Output-Dokumente der letzten Stage
  • Funktionen
    • Filterung
    • Sortierung
    • Gruppierung
      • es können Resultate für Gruppen berechnet werden: Anzahl, Summe, Durchschnitt, Minimum, Maximum
    • Bearbeitung
StageBeschreibungSyntax
$matchFilterung{ $match: { <query predicate> } }
$groupGruppierung{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
$sortSortierung{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
$projectEigenschaften-Auswahl{ $project: { <specification(s)> } }
$outSpeicherung in Collection in beliebiger Datenbank{ $out: "<output-collection>" }
$unwindRestrukturierung von Array-Elemente in einzelne Dokumente{ $unwind: <field path> }

$match - Filterung

db.collection.aggregate( [
{
$match: {
<query predicate>
}
}
] )

Beispiel:

db.collection.aggregate([
$match: {
$or: [
{ score: { $gt: 70, $lt: 90 } },
{ views: { $gte: 1000 } }
]
}
]);

$group - Gruppierung

db.collection.aggregate([
{
$group: {
_id: <expression>, // property to group with: "$fieldName"
<field1>: { <accumulator1> : <expression1> },
...
}
}
])
Bedeutung
<expression>existierendes Feld, nach dem gruppiert wird: $fieldName
<field1>neues Feld mit berechnetem Wert der Gruppe
<accumulator1>Definierung, welche Berechnung auf Gruppe ausgeführt werden soll
<expression1>Ausdruck für Berechnungs-Operator
AccumulatorBedeutung
$avgDurchschnitt
$bottomletztes Element
$buttomNletzte n Elemente
$countAnzahl der Elemente
$firstResultat von Expression des ersten Elements
$firstNResultat von Expression der ersten n Elemente
$lastResultat von Expression des letzten Elements
$lastNResultat von Expression der letzten n Elemente
$maxgrösster Wert einer Expression
$maxNn grösste Werte
$medianMedian
$mergeObjectsErstellung von Dokument durch Kombinierung aller Elemente
$minkleinster Wert einer Expression
$minNn kleinste Werte
$sumSumme
$toperstes Element
$topNerste n Elemente

Beispiel:

db.collection.aggregate([
{
$unwind: {
path: "$module"
}
},
{
$unwind: {
path: "$module.noten"
}
},
{
$group: {
_id: "$schueler.id",
schueler_name: {
$first: "$schueler.name"
},
schueler_vorname: {
$first: "$schueler.vorname"
},
noten_durchschnitt: {
$avg: "$module.noten.note"
}
}
}
])

$sort - Sortierung

db.collection.aggregate([
{
$sort: {
<field1>: <sort order>,
<field2>: <sort order>
...
}
}
])

<sort order>:

WertBedeutung
1ascending
-1descending

Beispiel:

db.shoes.aggregate( [
{
$match: { sizes: { $gt: 9 } }
},
{
$sort: { sizes: 1 }
}
] )

$limit - Limitierung

db.collection.aggregate( [
{ $limit: <positive 64-bit integer> }
] )

$project - Feld-Auswahl

Mit $project können Eigenschaften aus-, eingeblendet und hinzugefügt werden.

db.collection.aggregate( [
{
$project: {
<specification(s)>
}
}
] )

Beispiel:

db.collection.aggregate( [
{
$project: {
size: 1,
_id: 0,
name: { $toUpper: "$_id" }
}
}
] )

$set - Änderung und Hinzufügen von Feldern

db.zips.aggregate( [
{
$set: {
<field1>: <expression1>,
<field2>: <expression2>,
...
}
}
] )

Beispiel:

db.zips.aggregate( [
{
$set: {
population_2022: {
$round: {
$multiply: [
"$population_2021",
1.0031
]
}
}
}
}
] )

$count - Anzahl Dokumente

Zählt die Anzahl der Dokumente, welche durch die Pipeline zurückgegeben werden und zeigt diesen Wert in einem Feld an.

db.collection.aggregate( [```
{
$count: "<output-field>"
}
] )

$out - Speicherung in Collection in beliebiger Datenbank

Schreibt die Dokumente der Pipeline in eine neue Collection in der aktuellen oder einer beliebigen Datenbank. Existiert die zu erstellende Collection schon, wird sie überschrieben. MongoDB Docs - Time Series

db.collection.aggregate( [
{
$out: "<output-collection>"
}
] )

db.collection.aggregate( [
{
$out: {
db: "<output-db>",
coll: "<output-collection>"
}
}
] )

db.collection.aggregate( [
{
$out: {
db: "<output-db>",
coll: "<output-collection>",
timeseries: {
timeField: "<field-name>",
metaField: "<field-name>",
granularity: "seconds" || "minutes" || "hours" ,
}
}
}
] )

Time Series Collections speichern Daten, welche nach Zeit organisiert sind. Es werden die Werte der Daten an verschiedenen Zeitpunkten gespeichert.

Beispiel:

db.collection.aggregate( [
{
$out: {
db: "analyses",
coll: "books"
}
}
] )

$unwind - Restrukturierung von Array-Elemente in einzelne Dokumente

Mit $unwind werden alle Elemente eines bestimmten Arrays in ein einzelnes Dokument gepackt, wobei die anderen Eigenschaften in jedem so erstellten Dokument vorkommen.

db.collection.aggregate( [
{
$unwind: <field path>
}
] )

db.collection.aggregate( [
{
$unwind: {
path: <field path>,
includeArrayIndex: <string>,
preserveNullAndEmptyArrays: <boolean>
}
}
] )

Beispiel:

db.clothing.insertMany([
{ "_id" : 1, "item" : "Shirt", "sizes": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "Shorts", "sizes" : [ ] },
{ "_id" : 3, "item" : "Hat", "sizes": "M" },
{ "_id" : 4, "item" : "Gloves" },
{ "_id" : 5, "item" : "Scarf", "sizes" : null }
])

db.clothing.aggregate( [
{
$unwind: {
path: "$sizes"
}
}
] )

Ausgabe:

{ _id: 1, item: 'Shirt', sizes: 'S' },
{ _id: 1, item: 'Shirt', sizes: 'M' },
{ _id: 1, item: 'Shirt', sizes: 'L' },
{ _id: 3, item: 'Hat', sizes: 'M' }