Direkt zum Hauptinhalt

Datenbank, Tabelle, Datensätze erstellen, löschen , Datenbank kompirmieren

Beschreibung:

Wir erstellen drei Scripte zum verwalten einer Testdatenbank. Diese scripte können auch als Vorlage um Progragrammtechnisch die Datenbank mit Daten zu füllen.
Das letzte script db_free_space.py, kann überall benutzt werden um die Datenbankgröße zu optimieren.


Allerdings sollte das Script ausgeführt wrerden wenn keiner drin arbeitet. Währenddessen sind Schreibzugriffe blockiert.
Sollte man wissen!

  • Eins das die Test-Datenbank und Test-Tabelle erstellt : create_db.sh
  • Eins das die Datenbank um 100 MB pro Aufruf des Scriptes anwachsen lässt : fill_data.py Dieses ist ein python Script
  • Eins das die Tabelle wieder leert : delete_all.py Dieses ist auch ein python Script
  • Ein Script um den Speicher nach dem löschen wieder frei zu geben : db_free_space.py

Dazu muss python3 und die python mongo erweiterung installiert sein

apt install python3 python3-pymongo


Inhalt create_db.sh

#!/bin/bash

# Datenbank und Sammlung erstellen
mongosh <<EOF
use meineTestDatenbank
db.createCollection("testTabelle")
EOF

echo "Datenbank und Testtabelle erstellt."

Ausgabe:

MongoDB shell version v5.0.25
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("559ca2a0-399c-412a-9ad9-5120ff4be092") }
MongoDB server version: 5.0.25
================
switched to db meineTestDatenbank
{ "ok" : 1 }
bye
Datenbank und Testtabelle erstellt.


Inhalt fill_data.sh

Python script, mit der Anzahl der Dokumente spielen um die richtige Beleggröße zu bekommen.
Dieses Script schreibt ungefähr 400 kb dazu.

from pymongo import MongoClient, InsertOne
import random

# MongoDB-Client konfigurieren
client = MongoClient('localhost', 27017)

# Datenbank und Sammlung auswählen
db = client['meineTestDatenbank']
collection = db['testTabelle']

# Anzahl der Dokumente, die eingefügt werden sollen
num_docs = 10000

# Liste für Bulk-Insert-Operationen vorbereiten
operations = []

for i in range(num_docs):
    doc = {
        "name": f"Testname {i}",
        "beschreibung": f"Dies ist eine Testbeschreibung mit einer zufälligen Zahl: {random.randint(1, 10000)}",
        "nummer": i
    }
    # Füge die InsertOne-Operation zur Liste hinzu
    operations.append(InsertOne(doc))

    # Führe Bulk-Insert in Chargen aus, um Speicherprobleme zu vermeiden
    if len(operations) == 1000:
        collection.bulk_write(operations)
        operations.clear()  # Liste nach dem Bulk-Insert leeren
        print(f"{i+1} Dokumente eingefügt...")

# Restliche Dokumente einfügen
if operations:
    collection.bulk_write(operations)
    print(f"Die letzten {len(operations)} Dokumente wurden eingefügt.")

print(f"Es wurden insgesamt {num_docs} Dokumente zur 'testTabelle' in 'meineTestDatenbank' hinzugefügt.")

Speicher nach dem einfügen (das script wurde schon mehrmals laufen gelassen deshalb 2 MB Größe)

test> show databases
admin                40.00 KiB
config              108.00 KiB
local                40.00 KiB
meineTestDatenbank    2.74 MiB

Löschen aller eintrage delete_all.py

from pymongo import MongoClient

# MongoDB-Client konfigurieren
client = MongoClient('localhost', 27017)

# Datenbank und Sammlung auswählen
db = client['meineTestDatenbank']
collection = db['testTabelle']

# Alle Dokumente aus der Sammlung entfernen
result = collection.delete_many({})

# Ergebnis ausgeben
print(f"Anzahl der entfernten Dokumente: {result.deleted_count}")

Speicher nach dem löschen

test> show databases
admin                40.00 KiB
config              108.00 KiB
local                40.00 KiB
meineTestDatenbank    2.13 MiB

Speicherplatz freigeben

db_free_space.py

Inhalt

from pymongo import MongoClient

# Konfiguration
db_name = 'meineTestDatenbank'
collection_name = 'testTabelle'

# MongoDB-Client initialisieren
client = MongoClient('localhost', 27017)

# Zugriff auf die Datenbank und Sammlung
db = client[db_name]

# Führe den Compact-Befehl aus
try:
    print(f"Starte Compact-Vorgang für die Sammlung '{collection_name}' in der Datenbank '{db_name}'...")
    result = db.command({'compact': collection_name})
    print("Compact-Vorgang abgeschlossen.")
    print(result)
except Exception as e:
    print(f"Ein Fehler ist aufgetreten: {e}")

# Schließe die Verbindung
client.close()

Speicher nach dem Compacten:

test> show databases
admin               64.00 KiB
config              96.00 KiB
local               64.00 KiB
meineTestDatenbank  24.00 KiB
test>