Para meu banco de dados relativamente pequeno, acabei usando a seguinte solução. Não é realmente adequado para bancos de dados grandes ou complexos, mas é suficiente para o meu caso. Ele despeja todos os documentos como um json no diretório de backup. É desajeitado, mas não depende de outras coisas além do pymongo.
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))