2014-07-07 5 views
5

Gibt es eine PyMongo oder mongoengine zu MongoDBs mongodump entsprechende Funktion? Ich kann nichts in den Dokumenten finden.PyMongo/Mongoengine Äquivalent von Mongodump

Anwendungsfall: Ich muss regelmäßig eine Remote-Mongo-Datenbank sichern. Der lokale Computer ist ein Produktionsserver, auf dem kein Mongo installiert ist, und ich habe keine Administratorrechte. Daher kann ich subprocess nicht verwenden, um mongodump aufzurufen. Ich könnte den Mongo-Client lokal auf einem virtualenv installieren, aber ich würde einen API-Aufruf bevorzugen.

Vielen Dank :-).

+0

Pymongo und daher MongoEngine verbinden nur mit dem 'mongod' Prozess. Es kann jedoch auch sein, dass Sie 'mongodump' einfach auf einem entfernten Rechner ausführen, da Sie mit' mongodump/restore' eine Verbindung zu einer beliebigen entfernten Datenbank herstellen können. Sie müssen auf dem Rechner, auf dem "mondodump" läuft, nicht laufen hostet die db. Sinn ergeben? – MFB

+0

Meh. Ich denke, es ist einfacher, einfach alle Dokumente zu extrahieren und dann eine BSON-Datei zu erstellen. – Gx1sptDTDa

Antwort

5

Für meine relativ kleine Datenbank verwendete ich schließlich die folgende Lösung. Es ist nicht wirklich geeignet für große oder komplexe Datenbanken, aber es reicht für meinen Fall. Es speichert alle Dokumente als JSON im Backup-Verzeichnis. Es ist klobig, aber es ist nicht auf andere Sachen als Pymongo angewiesen.

from os.path import join 
import pymongo 
from bson.json_utils import dumps 

def backup_db(backup_db_dir): 
    client = pymongo.MongoClient(host=<host>, port=<port>) 
    database = client[<db_name>] 
    authenticated = database.authenticate(<uname>,<pwd>) 
    assert authenticated, "Could not authenticate to database!" 
    collections = database.collection_names() 
    for i, collection_name in enumerate(collections): 
     col = getattr(database,collections[i]) 
     collection = col.find() 
     jsonpath = collection_name + ".json" 
     jsonpath = join(backup_db_dir, jsonpath) 
     with open(jsonpath, 'wb') as jsonfile: 
      jsonfile.write(dumps(collection)) 
+1

danke für das Posten! Unterscheidet sich das in irgendeiner Weise vom kli 'mongodump'? Wird die resultierende JSON-Datei mit 'mongorestore' verwendbar sein? – Cmag

+1

Sie könnten über das Ergebnis von 'col.find()' iterieren, wenn Sie nicht alle Dokumente gleichzeitig im Speicher haben möchten. Sie haben _did_ erwähnt "relativ kleine kleine Datenbank". – farthVader

+0

können wir als bson speichern? – Kishan