31 Konfigurieren der MongoDB Shell

Die MongoDB Shell (mongosh) und ihre Vorgängerversion (mongo) bieten eine Vielzahl von Konfigurationsmöglichkeiten, um die Benutzererfahrung anzupassen und spezifische Anforderungen zu erfüllen.


31.1 Verbindungsoptionen

Beim Starten der Shell können Sie die Verbindung zu Ihrer MongoDB-Instanz oder Ihrem Cluster flexibel konfigurieren.

31.1.1 Host und Port

Verbindung zu einer spezifischen MongoDB-Instanz:

mongosh --host MeinHost --port 27017

31.1.2 Authentifizierung

Falls Ihre MongoDB-Instanz eine Authentifizierung verwendet:

mongosh --username meinBenutzer --password meinPasswort

Zusätzlich können Sie die Authentifizierungsdatenbank angeben:

mongosh --authenticationDatabase admin --username meinBenutzer --password meinPasswort

31.1.3 Verbindung zu Replica Sets

Verbinden Sie sich mit einem Replica Set:

mongosh --host replicaSetName/hostname1:27017,hostname2:27018,hostname3:27019

31.1.4 Verbindung zu Sharded Clustern

Geben Sie den Router (mongos) an:

mongosh --host mongosHost:27017

31.2 Konfigurationsdateien

Die Shell kann beim Start eine Konfigurationsdatei auslesen, um wiederkehrende Einstellungen oder benutzerdefinierte Funktionen zu laden.

31.2.1 .mongorc.js (für mongo) und .mongoshrc.js (für mongosh)

Die Datei befindet sich im Home-Verzeichnis des Benutzers und wird beim Start der Shell automatisch geladen.

31.2.1.1 Beispiel .mongoshrc.js:

// Automatisch mit einer bestimmten Datenbank verbinden
db = db.getSiblingDB('meineDatenbank');

// Hilfsfunktion zur Anzeige von Datenbanken
function zeigeDatenbanken() {
  return db.adminCommand('listDatabases');
}

// Anpassung des Prompts
prompt = function() {
  return db.getName() + "> ";
};

31.3 Anpassungen und Optionen in der Shell

31.3.1 Prompt anpassen

Das Standard-Prompt der Shell kann individuell gestaltet werden:

prompt = function() {
  return db.getName() + "@" + db.hostInfo().system.hostname + "> ";
};

31.3.2 Standard-Datenbank festlegen

Legen Sie beim Start der Shell eine Standard-Datenbank fest:

db = db.getSiblingDB('meineDatenbank');

31.3.3 JavaScript-Basierte Konfiguration

Da die Shell eine JavaScript-Umgebung ist, können Sie Konfigurationen direkt in JavaScript vornehmen:

// Automatischer Wechsel in eine bestimmte Datenbank
if (db.getName() === 'test') {
  db = db.getSiblingDB('meineDatenbank');
}

// Wiederverwendbare Funktion für spezifische Abfragen
function findeMaxAlter() {
  return db.meineSammlung.find().sort({ alter: -1 }).limit(1);
}

31.4 Erweiterte Optionen

31.4.1 TLS/SSL

Für sichere Verbindungen können Sie TLS/SSL aktivieren:

mongosh --host MeinHost --port 27017 --tls --tlsCertificateKeyFile /pfad/zum/zertifikat.pem --tlsCAFile /pfad/zur/ca.pem

31.4.2 SSH-Tunnel

Um über einen SSH-Tunnel auf MongoDB zuzugreifen:

ssh -L 27017:localhost:27017 benutzer@meinsserver
mongosh --host localhost --port 27017

31.5 Anzeige der verfügbaren Optionen

Mit dem --help-Flag können Sie alle verfügbaren Startoptionen anzeigen:

mongosh --help

31.6 Mongo Shell Scripting

MongoDB Shell Scripting ermöglicht die Automatisierung von Datenbankaufgaben, wie das Einfügen, Abfragen und Aktualisieren von Daten sowie die Durchführung von Wartungsaufgaben. Durch die Verwendung von JavaScript in der Shell können komplexe Operationen und wiederholbare Workflows effizient implementiert werden.


31.6.1 Grundlegendes Scripting

MongoDB-Skripte werden als JavaScript-Dateien gespeichert und mit der Shell ausgeführt. Beispielsweise können Sie ein Skript erstellen, um Dokumente in eine Sammlung einzufügen:

31.6.1.1 insert.js

db.meineSammlung.insertOne({
    name: "Max",
    alter: 30,
    stadt: "Berlin"
});

Führen Sie das Skript aus:

mongosh --host MeinHost --port 27017 meineDatenbank < insert.js

31.6.2 Erweiterte Funktionen

31.6.2.1 Schleifen und Iterationen

Mit JavaScript-Schleifen können Sie mehrere Operationen automatisieren:

for (let i = 1; i <= 5; i++) {
    db.meineSammlung.insertOne({ name: `Benutzer${i}`, alter: 20 + i });
}

31.6.2.2 Funktionen

Definieren Sie Funktionen, um wiederkehrende Aufgaben zu modularisieren:

function benutzerEinfuegen(name, alter) {
    db.meineSammlung.insertOne({ name: name, alter: alter });
}

benutzerEinfuegen("Anna", 25);
benutzerEinfuegen("Tom", 28);

31.6.2.3 Fehlerbehandlung

Nutzen Sie try-catch, um Fehler zu handhaben:

try {
    db.meineSammlung.insertOne({ name: "FehlerTest" });
    print("Dokument erfolgreich eingefügt.");
} catch (e) {
    print("Fehler: " + e.message);
}

31.6.3 Interaktion mit der Shell

31.6.3.1 Ausgaben

Nutzen Sie die print()-Funktion, um Nachrichten oder Ergebnisse in der Shell auszugeben:

let count = db.meineSammlung.countDocuments();
print("Anzahl der Dokumente: " + count);

31.6.3.2 Verzögerungen

Halten Sie Skripte mit sleep() für eine bestimmte Zeit an:

print("Warte 2 Sekunden...");
sleep(2000);

31.6.4 Arbeiten mit externen Dateien

Skripte können andere Dateien laden, um Modularität zu fördern:

load("utility.js");

// Nutzung der in "utility.js" definierten Funktion
utilityFunktion();

31.6.5 Beispiel: Komplexes Skript

31.6.5.1 komplexesSkript.js

Dieses Skript kombiniert verschiedene Konzepte, um mehrere Dokumente einzufügen, Abfragen durchzuführen und die Ergebnisse auszugeben:

// Funktion zum Einfügen eines Dokuments
function einfuegenBenutzer(name, alter, stadt) {
    try {
        db.meineSammlung.insertOne({ name: name, alter: alter, stadt: stadt });
        print(`Benutzer eingefügt: ${name}, ${alter}, ${stadt}`);
    } catch (e) {
        print("Fehler beim Einfügen: " + e.message);
    }
}

// Benutzer einfügen
einfuegenBenutzer("Max", 30, "Berlin");
einfuegenBenutzer("Anna", 25, "Hamburg");

// Abfrage und Ausgabe
let ergebnisse = db.meineSammlung.find({ alter: { $gte: 25 } }).toArray();
print("Benutzer ab 25 Jahren:");
printjson(ergebnisse);

// Anzahl der Dokumente in der Sammlung
let anzahl = db.meineSammlung.countDocuments();
print(`Gesamte Anzahl der Dokumente: ${anzahl}`);

Führen Sie das Skript aus:

mongosh --host MeinHost --port 27017 meineDatenbank < komplexesSkript.js

31.6.6 Tipps für das Scripting

  1. Organisieren Sie Skripte: Speichern Sie wiederverwendbaren Code in separaten Dateien.
  2. Verwenden Sie try-catch: Vermeiden Sie, dass Skripte aufgrund von Fehlern abbrechen.
  3. Debugging: Nutzen Sie print() für Debug-Ausgaben.
  4. Parameterübergabe: Übergabe von Parametern an Skripte kann über Umgebungsvariablen oder zusätzliche Eingaben erfolgen.