2017-01-12 2 views
1

Ich möchte die Daten einer Mongo-Datenbank in einer csv/Excel-Datei ausgeben. Meine Datenbank enthält mehrere Dokumente mit den gleichen Feldern und eingebetteten Feldern. Ich möchte, dass jedes eingebettete Feld eine Spalte meiner CSV-Datei und jedes Dokument eine Zeile enthält. Hier ist das Ziel:Dump einer Mongo-Datenbank in einer CSV-Datei

a_cursor = a_collection.find(filter, projection) # pymongo.collection.find() method 
a_csv_file = print_cursor_to_csv(a_cursor,projection) # the method I would like to create 
  • Mit dem Filter Argumente von find(), ich in der Lage sein, die Mongo Dokumente zu filtern.
  • Mit dem Projektionsargument von find(), wähle ich die Felder aus, die in CSV-Spalten eingefügt werden sollen.
  • Das Projektionsargument wird erneut in print_cursor_to_csv() verwendet, diesmal nur um die Reihenfolge der Felder/Spalten für die CSV-Datei anzugeben. Tatsächlich ist die Projektion eine Liste von Feldern und das erste Feld ist die erste CSV-Spalte. Hier

ist die Methode, die ich schrieb:

def _print_cursor_in_csv(cursor, fields_to_show_order): 
    """ 

    :param cursor: pymongo.Cursor. The list of documents to print into csv. 
    :param fields_to_show_order: List of String. Permits to know the order of columns chosen by the user. 
      Example : BaseStation_ID as first columns, then frequency of utilisation etc.. 
    """ 
    flattened_cursor = [] 
    for a_document in cursor: 
     flattened_cursor.append(_flatten_the_dict(a_document)) 
    string_csv = _get_string_csv_from_list_of_dicts(flattened_cursor, fields_to_show_order) 
    _write_a_file_from_a_string("testCSV"+".csv", string_csv) # PRINT CSV OF A DOC 

Meine Methode funktioniert, aber ist groß, und ich möchte mehr über Python Bibliotheken angewiesen wie Pandas, openpyxl oder csv. Vielleicht kann einer von ihnen eine csv-Datei aus einer Liste von Wörterbüchern nach dem Abflachen jedes einzelnen von ihnen schreiben.

Vielen Dank für Ihre Hilfe,

Matias

Antwort

0

Sie mongoexport dies zu tun, verwenden können. Hier ist ein Beispiel, das alle Daten des Datenbank-Tests im Sammelverkehr in eine CSV-Datei ablegt. (Ab Version 3.0. Mongo entfernt die --csv Option bitte verwenden Sie die --type = csv)

mongoexport --db test --collection traffic --type=csv --out traffic.csv 

, falls Sie die Anzahl der Datensätze schrumpfen, dies zu tun, indem Sie die Daten abfragen Sie wollen Dump . Fügen Sie einfach eine Abfrage mit -q zB:

--query '{"field": 1}' 

Falls nur Sie einige Feld wollen (s) exportiert werden der Sie die folgende Option hinzufügen können (mit csv Sie eine Feldliste zur Verfügung stellen müssen):

--fields <field1,field2> 

Bitte stellen Sie sicher, dass nach dem Komma kein Leerzeichen mehr vorhanden ist. Felder mit Leerzeichen werden weiterhin durch Kommas getrennt, ohne Leerzeichen oder Leerzeichen, aber Sie müssen die komplette Liste in Anführungszeichen setzen (die Dokumentation ist etwas unklar).

Wenn Sie ein spezielles Feld zu erhalten, die eingebettet ist Sie diese durch adressieren:

--fields "field1,toplevelFieldName.0.field2" 

Bitte beachten Sie, dass es eine „0“ als Index für das Element ist. monogexport kann nicht alle Elemente top csv exportieren, so dass Sie sie entweder einzeln ansprechen müssen, was unrealistisch ist. Oder Sie verwenden $unwind, um die Daten in einer weiteren Sammlung zu speichern, die Sie dann exportieren können.

OR falls Sie etwas dagegen zu Dokument, das Sie verwenden können, nicht bekommen die komplette eingebettet:

-- fields "field1,toplevelFieldName" 

toplevelFieldName ist der Name des eingebetteten Dokuments.

Eine vollständige Dokumentation zu mongoexport finden Sie unter here.

+0

Vielen Dank, es ist in der Tat viel einfacher. Ich habe zwei zusätzliche Fragen: Beim Versuch, mit mongoexport --authenticationMechanism SCRAM-SHA-1 zu authentifizieren, bekomme ich den Fehler: '2017-01-13T09: 25: 27.625 + 0100 User Assertion: 2: SCRAM-SHA-1 Mechanismus Unterstützung nicht in Client-Bibliothek kompiliert. Ich habe mongoexport 2.6.10. Zweite Frage: In meiner Datenbank habe ich einige Felder, die Listen von Wörterbüchern sind, jedes Wörterbuch hat die gleichen zwei Felder, x und y. Ich möchte diese Daten exportieren, um X-Werte in den Spaltenheadern und Y-Werten in den verwandten Zellen für jedes Dokument zu erhalten. Nochmals vielen Dank – Matias

+0

Seit Version 3.0 MongoDB nicht mehr standardmäßig auf MONGODB-CR und stattdessen SCRAM-SHA-1 als Standard-Authentifizierungsmechanismus. Sie können '- authenticationMechanism MONGODB-CR' für ältere Versionen verwenden – MBushveld

Verwandte Themen