Offenes Webinar „MongoDB-Grundlagen“

Freunde, ein weiterer Kursstart "Datenbank" findet morgen statt, daher haben wir eine traditionelle offene Unterrichtsstunde abgehalten, deren Aufzeichnung Sie sich ansehen können hier. Dieses Mal haben wir über die beliebte MongoDB-Datenbank gesprochen: Wir haben einige Feinheiten studiert und uns mit den Grundlagen des Betriebs, den Funktionen und der Architektur befasst. Wir haben auch einige Benutzerfälle angesprochen.

Offenes Webinar „MongoDB-Grundlagen“

Das Webinar wurde abgehalten Ivan Belt, Leiter der Serverentwicklung bei Citymobil.

MongoDB-Funktionen

MongoDB ist ein dokumentenorientiertes Open-Source-DBMS, das keine Beschreibung des Tabellenschemas erfordert. Es ist als NoSQL klassifiziert und verwendet BSON (binäres JSON). Sofort skalierbar, in C++ geschrieben und unterstützt JavaScript-Syntax. Es gibt 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 nun die grundlegenden Befehle an, die nützlich sein können.

Also, um MongoDB in Docker bereitzustellen, wir schreiben:

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

So geschieht es Client-Start MongoDB:

Offenes Webinar „MongoDB-Grundlagen“

Schreiben wir nun das traditionelle Hallo Welt:

print (“Hello world!”)

Offenes Webinar „MongoDB-Grundlagen“

Danach - Lasst uns den Zyklus beginnen:

Offenes Webinar „MongoDB-Grundlagen“

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

Wann sollte MongoDB verwendet werden?

Es gibt eine Geschichte, dass das durchschnittliche Startup im Silicon Valley die Person ist, die vor einer Woche das Buch „HTML für Dummies“ aufgeschlagen hat. Welchen Stapel wird er wählen? Stimmen Sie zu, dass es für ihn sehr praktisch ist, wenn er aus offensichtlichen Gründen JavaScript in seinem Browser hat, Node.js auf dem Server läuft und JavaScript auch in der Datenbank läuft. Das ist Punkt Nummer 1.

Zweitens gibt es Gute Leistung Peter Zaitsev, einer der besten Datenbankspezialisten Russlands. Darin spricht Peter über MySQL und MongoDB und legt dabei besonderen Wert darauf, wann und was am besten zu verwenden ist.

Drittens möchte ich betonen, dass sich MongoDB durch gute Eigenschaften auszeichnet Skalierbarkeit - und das ist eines der Hauptmerkmale der Datenbank. Wenn Sie nicht im Voraus wissen, wie hoch die Auslastung sein wird, ist MongoDB perfekt. Darüber hinaus werden vorkonfigurierte Muster unterstützt, z Scherben и Reproduzieren, und das alles geschieht ziemlich transparent, das heißt, es ist sehr bequem zu arbeiten.

Hinsichtlich Terminologie in MongoDB dann:

  • Datenbanken sind Datenbanken (Schemata, Tabellensammlungen);
  • In MongoDB gibt es so etwas wie коллекция - Dies ist ein Analogon einer Tabelle und einer Reihe von Dokumenten, die logischerweise verbunden werden sollten;
  • Dokumente sind analog zu einer Zeichenfolge.

Datenbankerstellung und einfache Abfragen

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

use learn

Offenes Webinar „MongoDB-Grundlagen“

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

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

db - ein globales Objekt für den Zugriff auf die Datenbank, also eigentlich die „Monga“ selbst. Wird zum Sharding verwendet sh, zur Replikation - rs.

Welche Befehle hat das Objekt? db:

Offenes Webinar „MongoDB-Grundlagen“

Kehren wir also zu unserem Befehl zurück, woraufhin die Konsole meldet, dass eine Zeile eingefügt wurde:

Offenes Webinar „MongoDB-Grundlagen“

Слово unicorns in einer Mannschaft db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) bezeichnet eine Sammlung. Bitte beachten Sie hier, dass wir die Sammlung nicht beschrieben oder erstellt haben, sondern einfach „Einhörner“ geschrieben, eine Einfügung gemacht haben und schon hatten wir eine Sammlung.

Und so können wir es tun Holen Sie sich alle unsere Kollektionen:

db.getCollectionNames()

Und so weiter. Kann noch eins einfügen Sammlung:

Offenes Webinar „MongoDB-Grundlagen“

Jetzt fragen wir komplette Sammlung (Wir erinnern Sie daran, dass in unserem Fall die Datenbank bereits Informationen über zwei Einhörner mit demselben Namen enthält):

db.unicorns.find()

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

Offenes Webinar „MongoDB-Grundlagen“

Jetzt fügen wir noch ein paar Einhörner mit den gleichen 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:

Offenes Webinar „MongoDB-Grundlagen“

Wie Sie sehen, haben wir zusätzliche Felder: home и Wurm, was Aurora nicht hat.

Fügen wir 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 mit JavaScript vier weitere Objekte eingefügt:

Offenes Webinar „MongoDB-Grundlagen“

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

Die Antwort liegt auf der Hand – in Monga, und das obige Beispiel zeigt dies gut. Es ist kein Geheimnis, dass KLADR in der Russischen Föderation ein Ärgernis ist. Und Monga passt sehr gut zu Adressen, da man alles als Array festlegen kann und das Leben viel einfacher wird. Und es ist gut Benutzerfall für MongoDB.

Fügen wir weitere Einhörner hinzu:

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});

Offenes Webinar „MongoDB-Grundlagen“

Achten Sie nun auf die Unterlagen. Als dob Wir lagern komplette Objekte. Es gibt auch Informationen darüber, was ein Einhorn mag, und nicht jeder hat diese Informationen. Es liegen also innere Lügen vor vollständiges Array.

Um die Ergebnisse schöner anzuzeigen, können Sie die Methode übrigens am Ende des Suchbefehls aufrufen .pretty():

Offenes Webinar „MongoDB-Grundlagen“

Wenn Sie es brauchen Informationen zum letzten Fehler, 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 nachzulesen amtliche Dokumentation, was übrigens in Monga sehr informativ ist. Übrigens ist es auch auf Habré erhältlich guter Artikel diesbezüglich.

Kommen wir zu komplexeren Abfragen

Abfrage nach exaktem Feldwert:

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

Wenn wir eine solche Anfrage schreiben, erhalten wir in der Konsolenausgabe eine Liste aller männlichen Einhörner.

Sie können es auch tun Abfrage mehrerer Felder gleichzeitig: nach Geschlecht und Gewicht:

Offenes Webinar „MongoDB-Grundlagen“

Achten Sie oben auf das Besondere $gt-Selektor, mit dem Sie alle männlichen Einhörner mit einem Gewicht von mehr als 700 züchten können.

Du kannst nachschauen existiert das Feld überhaupt?:

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

Oder so:

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

Das nächste Team wird die Einhörner hervorbringen, deren Namen mit den Buchstaben A oder a beginnen:

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

Jetzt überlegen Array-Suche. Frage Nr. 1: Was wird dieser Befehl ausgeben:

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

Das ist richtig: jeder, der Äpfel liebt.

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

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

Und noch ein Befehl:

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

In unserem Fall wird nichts zurückgegeben, da bei der Übergabe eines Arrays das erste Element mit dem ersten, das zweite mit dem zweiten usw. verglichen wird. Das heißt, das Array muss auch übereinstimmen nach Position diese Werte.

Und so sieht es aus Durchsuchen eines Arrays mit dem „OR“-Operator:

Offenes Webinar „MongoDB-Grundlagen“

Das folgende Beispiel zeigt es uns Suche mit dem Operator $all. Und hier ist die Reihenfolge unwichtig:

Offenes Webinar „MongoDB-Grundlagen“

Das können wir auch Suche nach Array-Größe:

Offenes Webinar „MongoDB-Grundlagen“

Was aber, wenn wir ein Array finden möchten, dessen Größe größer als eins ist? Dafür gibt es einen Operator $wo, 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, Hier bist du Datei mit Befehlen.

Cursorfunktionen

Lassen Sie uns ein wenig abschweifen und ein paar Worte zu den Funktionen von Monga sagen:

  • find() und andere Operationen geben keine Daten zurück – sie geben einen sogenannten „Cursor“ zurück;
  • Die Tatsache, dass wir sehen, wie die Daten gedruckt werden, ist die Arbeit des Dolmetschers.

Tippen db.unicorns.find Ohne Klammern erhalten wir die Eingabeaufforderung:

Offenes Webinar „MongoDB-Grundlagen“

Wir erfüllen weiterhin Anfragen

Es gibt auch den $in-Operator:

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

Offenes Webinar „MongoDB-Grundlagen“

Lassen Sie uns nun über das Update sprechen. Ändern wir zum Beispiel das Gewicht des Rooooodles-Einhorns:

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

Als Ergebnis unseres Handelns wurde das Dokument wird komplett aktualisiert, und nur ein angegebenes Feld bleibt darin:

Offenes Webinar „MongoDB-Grundlagen“

Das heißt, das Einzige, was für unser Objekt übrig bleibt, ist das Gewicht 2222 und natürlich die ID.

Sie können die Situation mit korrigieren $ set:

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

Offenes Webinar „MongoDB-Grundlagen“

Es ist auch möglich Werte erhöhen:

Offenes Webinar „MongoDB-Grundlagen“

Und da ist Upsert - Kombination aus Update und Insert:

Offenes Webinar „MongoDB-Grundlagen“

So wird es gemacht Feldauswahl:

Offenes Webinar „MongoDB-Grundlagen“

Offenes Webinar „MongoDB-Grundlagen“

Es bleiben noch ein paar Worte darüber hinzuzufügen überspringen и begrenzen:

Offenes Webinar „MongoDB-Grundlagen“

Kolleginnen und Kollegen, das ist alles, wenn Sie die Details wissen wollen, Schau dir das ganze Video an. Und vergessen Sie nicht, Ihre Kommentare zu hinterlassen!

Source: habr.com

Kommentar hinzufügen