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
MongoDB-Leitfaden
- MongoDB-Überblick: Einstieg mit MongoDB
- Wie man MongoDB auf Ubuntu und Mac installiert
- Erstellung einer Datenbank in MongoDB
- MongoDB Shell Grundbefehle
- MongoDB Compass: Nutzung der Mongo GUI
- MongoDB rollenbasierte Zugriffskontrolle (RBAC) erklärt
- MongoDB-Projektion und Projektionsoperatoren erklärt
- MongoDB-Aggregatfunktionen erklärt
- MongoDB-Sortierung: sort()-Methode & Beispiele
- Verwendung von Push-and-Pull-Operatoren in MongoDB
- Wie man MongoDB $unwind
- 23 Gängige MongoDB-Abfrageoperatoren und deren Verwendung
- MongoDB GeoLocation-Abfragebeispiele
- Einführung in MongoDB-Transaktionen
- MongoDB-Indizes: Top-Indextypen und deren Verwaltung
- Die wichtigsten MongoDB-Befehle, die du kennen solltest
- MongoDB-Replikation: Eine vollständige Einführung
- Wie man einen MongoDB-Cluster einrichtet
- MongoDB Sharding: Konzepte, Beispiele & Tutorials
- MongoDB Atlas: Einrichtung und Nutzung von verwaltetem MongoDB
- Wie man MongoDB als Docker-Container ausführt
- MongoDB-Speichernutzung, Verwaltung und Anforderungen
- Wie man Mongodump für MongoDB-Backups verwendet
- Mongorestore-Beispiele zur Wiederherstellung von MongoDB-Backups
- Wie man PyMongo benutzt
- Wie man Mongoose für MongoDB und NodeJS verwendet
- MongoDB Spickzettel
- MongoDB vs Cassandra: NoSQL-Datenbanken im Vergleich
- PostgreSQL vs MongoDB: Vergleich von Datenbanken
- MySQL vs. MongoDB: Vergleich von Datenbanken
- MongoDB-Zertifizierungen: Eine Einführung
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.