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' }