MongoDB-Aggregatfunktionen erklärt

MongoDB-Aggregatfunktionen erklärt

  • Orchestrierung
6 Minuten Lesezeit Aktualisiert Oct 31, 2017

Auf einen Blick: MongoDB-Aggregatfunktionen ermöglichen komplexe Datenanalysen ähnlich wie SQL und decken wesentliche Funktionen wie Zählen und Summen ab. Ein Tutorial veranschaulicht diese Funktionen anhand von Beispielen, darunter das WordCount-Programm und die MapReduce-Techniken.

  • Aggregatfunktionen bestehen aus Zahl, Summe, Durchschnitt, Minimum und Maximum.
  • Beispiele sind WordCount und verschiedene Operationen für die Datenanalyse.

Dies ist der zweite Teil des Tutorials , wie man NodeJS mit MongoDB verwendet. Hier wechseln wir zur Verwendung der regulären MongoDB-Shell und Befehle, um das Studium aggregierter Funktionen zu erleichtern.

Um zu zeigen, wie man aggregierte Funktionen verwendet, erklären wir zunächst, wie man grundlegende Abfragen macht. Dann zeigen wir, wie man das WordCount-Programm umsetzt, mit dem die Leute beginnen, wenn sie zum Beispiel Apache Spark zum ersten Mal lernen.

Im Grunde gibt es zwei aggregierte Funktionen: aggregierte und MapReduce. Aggregierte Funktionen sind identisch mit dem vertrauten SQL-Befehl:

MapReduce

    SQL select xxx, count (xxx) from table group by xxx

Die aggregierten Funktionen sind Zähl, Summe, Durchschnitt, Min, Max usw.

Die Daten, die wir im ersten Teil verwendet haben, waren das Raucher-Survey-Datum. Sie hat eine komplexe Struktur. Erinnern Sie sich, dass das Schema folgendes lautet:

    var schema = new mongoose.Schema({
cachedContents : {
largest : String,
non_nill : Number,
nill : Number,
tip : [{
item : String,
count: Number
}] ,
smallest : String,
format : {
displayStyle : String,
align : String
}
}
});

Und die Stichprobendaten sehen so aus:

    "_id" : ObjectId("59e9a6144bde260fa07e68f1"),
"cachedContents" : {
"nill" : 0,
"non_nill" : 14069,
"largest" : "WY",
"tip" : [
{
"item" : "NC",
"count" : 20,
"_id" : ObjectId("59e9a6144bde260fa07e6905")
},
{
"item" : "ND",
"count" : 19,
"_id" : ObjectId("59e9a6144bde260fa07e6904")
},
{
"item" : "OH",
"count" : 18,
"_id" : ObjectId("59e9a6144bde260fa07e6903")
},
…. (shortened)…..
{
"item" : "WY",
"count" : 2,
"_id" : ObjectId("59e9a6144bde260fa07e68f3")
},
{
"item" : "IN",
"count" : 1,
"_id" : ObjectId("59e9a6144bde260fa07e68f2")
}
]
},
"__v" : 0
}

Das ist kompliziert zu verarbeiten, da es ein Array eingebetteter Dokumente enthält: tip:[{item, count}]. Wir zeigen zuerst, wie man diese Daten abfragt, dann machen wir einfachere Daten, um die Aggregate- und mapreduce-Funktionen darzustellen.

Einfache Abfragen

Eine einfache Suchanfrage liefert alle Felder aus. So:

    db.smokersmodels.find({ "cachedContents.largest" : "2016" }).pretty()
    "_id" : ObjectId("59e9a6144bde260fa07e6fda"),
"cachedContents" : {
"nill" : 0,
"non_nill" : 14069,
"largest" : "2016",
"tip" : [
{
"item" : "2014-2015",
"count" : 20,
"_id" : ObjectId("59e9a6144bde260fa07e6fe5")
},
… (and so forth) ….

Beachten Sie, dass wir pretty() verwenden, um die Ausgabe in JSON zu formatieren, damit sie leichter lesbar ist.

Beachte auch, dass wir Anführungszeichen um die Feldnamen setzen. Wenn man sich die Anweisungen von MongoDB anschaut, lassen sie sie aus. Das verursacht jedoch einen Syntaxfehler, wenn wir die Mongo-Shell verwenden. Es scheint darüber etwas Verwirrung zu geben, wenn man sich StackOverflow anschaut. Wir verwenden MongoDB-Version mongoDB-linux-x86_64-debian81-3.4.9.

Und wir verwenden die Dot-Notation wie cachedContents.gréisst , um Felder zu ziehen, die in unserem Dokument verschachtelt sind.

Um bestimmte Felder auszugeben, setzen wir sie nach der Abfrage und setzen die Zahl 1, um anzuzeigen, welche gedruckt werden sollen. Beachten Sie hier, wie die Ausgabe aussieht, wenn wir pretty() weglassen.

    db.smokersmodels.find({ "cachedContents.largest" : "2016" } , { "cachedContents.largest" : 1 })
    { "_id" : ObjectId("59e9a6144bde260fa07e688c"), "cachedContents" : { "largest" : "2016" } }
{ "_id" : ObjectId("59e9a6144bde260fa07e68ad"), "cachedContents" : { "largest" : "2016" } }
{ "_id" : ObjectId("59e9a6144bde260fa07e68e5"), "cachedContents" : { "largest" : "2016" } }
{ "_id" : ObjectId("59e9a6144bde260fa07e693d"), "cachedContents" : { "largest" : "2016" } }
{ "_id" : ObjectId("59e9a6144bde260fa07e69c3"), "cachedContents" : { "largest" : "2016" } }

Einfache Aggregation

Verwenden Sie die separate Operation für eine einfache Aggregation:

    db.smokersmodels.distinct("cachedContents.largest")
[
"2016",
"WY",
"Wyoming",
"Tobacco Use – Survey Data",
"Cigarette Use (Adults)",
"Smoking Status",
"BRFSS",
"Some Days",
"%",
"Percentage",
"87.9",
"*",
"Data in these cells have been suppressed because of a small sample size",
"14.9",
"85.4",
"90.4",
"39839",
"Overall",
"White",
"All Ages",
"All Grades",
"BEH",
"101BEH"
]

Wortanzahl

Jetzt erstellen wir einige einfachere Daten, um zu veranschaulichen, wie man das WordCount-Programm mit MongoDB umsetzt.

Zuerst erstelle einige Daten:

    db.words.insertMany( [
{ word: "the" },
{ word: "rain" },
{ word: "in" },
{ word: "spain" },
{ word: "spain" }
]);

Sie drucken es aus, um zu sehen, wie es aussieht:

    db.words.find().pretty()
{ "_id" : ObjectId("59eb051e878eb4d6aca74243"), "word" : "the" }
{ "_id" : ObjectId("59eb051e878eb4d6aca74244"), "word" : "rain" }
{ "_id" : ObjectId("59eb051e878eb4d6aca74245"), "word" : "in" }
{ "_id" : ObjectId("59eb051e878eb4d6aca74246"), "word" : "spain" }
{ "_id" : ObjectId("59eb051e878eb4d6aca74247"), "word" : "spain" }

Der Trick beim WordCount-Programm bestand immer darin, die (Schlüssel-, Wert-)Paare (Wort, 1) zu bilden und dann die Zahl 1 zu summieren:

    db.words.aggregate([ {$group: { _id: "$word", cnt: {$sum: 1} } } ])
    { "_id" : "in", "cnt" : 1 }
{ "_id" : "rain", "cnt" : 1 }
{ "_id" : "spain", "cnt" : 2 }
{ "_id" : "the", "cnt" : 1 }

Wie Sie sehen, kommt das Wort Spanien zweimal vor.

Das mit mapReduce bewirkt im Grunde dasselbe. Zuerst erstellen wir (Key, Value) Paare (Word, 1) mit der Emitt-Funktion . Dann verwenden wir die JavaScript-Funktion Array.sum, um die Zahl 1 zu summieren.

    db.words.mapReduce(
function() { emit(this.word,1); },
    function(key, values) {return Array.sum(values)}, {
query:{},
    } out:"total_matches"
).find()
    { "_id" : "in", "value" : 1 }
{ "_id" : "rain", "value" : 1 }
{ "_id" : "spain", "value" : 2 }
{ "_id" : "the", "value" : 1 }

Das Ergebnis ist dasselbe.

Zusätzliche Ressourcen

play

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Orchestrierung

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.