Offenes Webinar "Grundlagen der MongoDB"

Freunde, der nächste Start des Datenbankkurses findet morgen statt, daher haben wir eine traditionelle offene Lektion abgehalten, deren Aufzeichnung Sie hier sehen können . Diesmal haben wir über die beliebte MongoDB-Datenbank gesprochen: Wir haben einige Feinheiten untersucht, die Grundlagen der Arbeit, Funktionen und Architektur untersucht. Und auch einige User Cases berührt.



Das Webinar wurde von Ivan Remen , Leiter Serverentwicklung bei Citimobil, durchgeführt.


MongoDB-Funktionen


MongoDB ist ein dokumentenorientiertes Open Source-Datenbankverwaltungssystem, für das keine Beschreibung des Tabellenschemas erforderlich ist. Es ist als NoSQL klassifiziert und verwendet BSON (binäres JSON). Standardmäßig skaliert, in C ++ geschrieben und unterstützt die JavaScript-Syntax. Keine SQL-Unterstützung.

MongoDB verfügt über Treiber für viele gängige Programmiersprachen (C, C ++, C #, Go, Java, JavaScript, Perl, PHP, Python, Ruby usw.). Es gibt auch inoffizielle und von der Community unterstützte Treiber für andere Programmiersprachen.

Schauen wir uns die grundlegenden Befehle an, die nützlich sein können.

Um MongoDB in Docker bereitzustellen , schreiben wir:

docker run -it --rm -p 127.0.0.1:27017:27017 --name mongo-exp-project mongo docker exec -it mongo-exp-project mongo 

Somit startet der MongoDB- Client :



Schreiben wir nun die traditionelle Hallo Welt :

 print (“Hello world!”) 



Führen Sie danach die Schleife aus :



Wie Sie bemerkt haben, haben wir reguläres JS vor uns, und MongoDB ist ein vollwertiger JavaScript-Interpreter .

Wann soll MongoDB verwendet werden?


Es gibt eine Geschichte, dass das durchschnittliche Startup im Silicon Valley der Mann ist, der vor einer Woche das Buch „HTML for Dummies“ aufgeschlagen hat. Welchen Stapel wird er wählen? Sie müssen zugeben, dass es für ihn sehr praktisch ist, wenn er aus offensichtlichen Gründen JavaScript in seinem Browser hat, Node.js auf dem Server ausgeführt wird und JavaScript auch in der Datenbank enthalten ist. Dies ist Punkt Nummer 1.

Zweitens gibt es eine hervorragende Präsentation von Peter Zaitsev, einem der besten Datenbankexperten in Russland. Darin spricht Peter über MySQL und MongoDB und konzentriert sich darauf, wann und was am besten zu verwenden ist.

Drittens möchte ich betonen, dass MongoDB durch eine gute Skalierbarkeit gekennzeichnet ist - und dies ist eines der Hauptmerkmale der Datenbank. Wenn Sie nicht im Voraus wissen, wie hoch die Last sein wird, ist MongoDB perfekt. Darüber hinaus werden sofort einsatzbereite Muster wie Sharding und Replikation unterstützt , und all dies ist recht transparent, dh es ist sehr bequem zu arbeiten.

Was die Terminologie in MongoDB betrifft, dann:

  • Basen sind Basen (Schemata, eine Gesamtheit von Tabellen);
  • In MongoDB gibt es so etwas wie eine Sammlung - es ist ein Analogon einer Tabelle und einer Reihe von Dokumenten, die gemäß der Logik der Dinge verbunden werden sollten.
  • Dokumente sind ein Analogon einer Zeile.

Datenbankerstellung und einfache Abfragen


Um eine Datenbank zu erstellen, müssen Sie sie nur verwenden:

 use learn 



Machen Sie nun eine kleine Einfügung des Dokuments. Sei es zum Beispiel ein Einhorn namens Aurora:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 

db ist ein globales Objekt für den Zugriff auf die Datenbank, dh die "Monga" selbst. Für das Sharding wird sh verwendet, für die Replikation wird rs verwendet .

Welche Befehle hat das db- Objekt:



Also zurück zu unserem Team, woraufhin die Konsole meldet, dass eine Zeile eingefügt wurde:



Das Wort unicorns im db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) bedeutet eine Sammlung. Bitte beachten Sie, dass wir die Sammlung nicht beschrieben oder erstellt haben, sondern einfach 'Einhörner' geschrieben, eine Beilage angefertigt und eine Sammlung erhalten haben.

Und so können wir alle unsere Sammlungen erhalten :

 db.getCollectionNames() 

Na und so weiter. Wir können eine weitere Sammlung einfügen :



Jetzt fordern wir eine vollständige Sammlung an (wir erinnern uns, dass die Datenbank in unserem Fall bereits Informationen zu zwei gleichnamigen Einhörnern enthält):

 db.unicorns.find() 

Bitte beachten Sie, dass hier unser JSON ist (es gibt einen Namen, ein Geschlecht, ein Gewicht und eine eindeutige Kennung des Objekts):



Fügen wir nun ein paar weitere Einhörner mit demselben Namen ein:

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) 

Und mal sehen, was passiert ist:



Wie Sie sehen können, haben wir zusätzliche Felder: Heimat und Wurm , die Aurora nicht hat.

Fügen Sie noch ein paar Einhörner hinzu:

 db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, {name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, {name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}]) 

Also haben wir vier weitere Objekte mit JavaScript eingefügt:



In welchen Datenbanken ist es Ihrer Meinung nach bequemer, Passdaten zu speichern: in relationalen Datenbanken oder in Mong?

Die Antwort liegt auf der Hand - in mong, und das obige Beispiel zeigt es gut. Es ist kein Geheimnis, dass KLADR in der Russischen Föderation ein Schmerz ist. Und Monga fällt sehr gut auf die Adressen, weil Sie alles als Array festlegen können und es viel einfacher zu leben sein wird. Und dies ist ein guter User Case für MongoDB .

Weitere Einhörner hinzufügen:

 db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 



Achten Sie nun auf die Dokumente. Als dob speichern wir ganze Objekte. Und es gibt auch Informationen, die das Einhorn liebt, und nicht jeder hat diese Daten. Somit befindet sich im Inneren ein vollständiges Array .

Übrigens können Sie für eine schönere Ausgabe die Methode .pretty() am Ende des .pretty() aufrufen:



Wenn Sie Informationen zum letzten Fehler benötigen, verwenden Sie den folgenden Befehl:

 db.getLastError() 

Dies kann nach jedem Einfügen erfolgen, oder Sie können Write Concern konfigurieren. Es ist besser, darüber in der offiziellen Dokumentation zu lesen, die übrigens in mong sehr informativ ist. Übrigens gibt es dazu auch einen guten Artikel über das Habré.

Weiter zu komplexeren Abfragen


Anfrage für genauen Feldwert:

 db.unicorns.find({gender: 'm'}) 

Durch das Schreiben einer solchen Anfrage erhalten wir in der Ausgabe auf der Konsole eine Liste aller männlichen Einhörner.

Sie können die Abfrage auch sofort in mehreren Feldern ausführen: nach Geschlecht und Gewicht:



Achten Sie oben auf den speziellen $ gt-Selektor , mit dem Sie alle männlichen Einhörner mit einem Gewicht von mehr als 700 anzeigen können.

Sie können überprüfen, ob das Feld überhaupt vorhanden ist :

 db.unicorns.find({vampires: {$exists: false}}) 

Oder so:

 db.unicorns.find({'parents.father': {$exists: true}}) 

Der folgende Befehl zeigt Einhörner an, deren Namen mit den Buchstaben A oder a beginnen:

 db.unicorns.find({name: {$regex: "^[Aa]"}}) 

Schauen wir uns nun eine Array-Suche an . Frage Nummer 1: Was wird dieser Befehl ausgeben:

 db.unicorns.find({loves:'apple'}) 

Das stimmt: Jeder, der Äpfel liebt.

Der folgende Befehl gibt nur die Einhorndaten zurück, die nur Äpfel und Wassermelonen enthalten:

 db.unicorns.find({loves:[ "apple", "watermelon" ]}) 

Und noch ein Befehl:

 db.unicorns.find({loves:[ "watermelon", "apple" ]}) 

In unserem Fall wird nichts zurückgegeben, da beim Übergeben eines Arrays das erste Element mit dem ersten, das zweite mit dem zweiten usw. verglichen wird. Das heißt, das Array muss auch an den Positionen dieser Werte übereinstimmen.

Und so sieht eine Array-Suche mit dem Operator OR aus :



Das folgende Beispiel zeigt uns eine Suche mit dem Operator $ all . Und hier ist die Sequenz schon prinzipienlos:



Wir können auch nach der Größe des Arrays suchen:



Aber was ist, wenn wir ein Array finden wollen, das größer als eins ist? Hierfür gibt es einen $ where- Operator, mit dem Sie komplexere Dinge schreiben können:

 db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } }) 

Übrigens, wenn Sie üben möchten, finden Sie hier eine Datei mit Befehlen.

Cursorfunktionen


Lassen Sie uns ein wenig abschweifen und ein paar Worte über die Eigenschaften von Monga sagen:

  • find () und andere Operationen geben keine Daten zurück - sie geben den sogenannten "Cursor" zurück;
  • Was wir sehen, wenn die Daten gedruckt werden, ist die Arbeit des Dolmetschers.

Wenn Sie db.unicorns.find ohne Klammern eingeben , erhalten Sie einen Hinweis:



Wir erfüllen weiterhin Anfragen


Es gibt auch den Operator $ in:

 db.unicorns.find({weight: {$in: [650, 704]}}) 



Lassen Sie uns nun über das Update sprechen . Ändern wir zum Beispiel das Gewicht der Einhorn-Roooooodles:

 db.unicorns.update({name: "Roooooodles"}, {weight: 2222}) 

Aufgrund unserer Maßnahmen wird das Dokument vollständig aktualisiert und es bleibt nur ein bestimmtes Feld darin:



Das heißt, das einzige, was bei unserem Objekt bleibt, ist das Gewicht von 2222 und natürlich id.

Sie können dies mit $ set beheben:

 db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}}) 




Es ist auch möglich, Werte zu erhöhen :



Es gibt auch Upsert - eine Kombination aus Update und Insert:



Und so wählen Sie Felder aus :





Es bleiben noch ein paar Worte zum Überspringen und Begrenzen :



Kollegen, das ist alles, wenn Sie die Details wissen möchten, schauen Sie sich das gesamte Video an . Und vergessen Sie nicht, Ihre Kommentare zu hinterlassen!

Source: https://habr.com/ru/post/de474054/


All Articles