2016-11-03 1 views
0

Ich habe einige Daten JSON, die wie folgt aussieht:JSON von MongoDB zu CSV, dann transponieren Zeilen

[{ 
     id: "1", 
     quantity: "3", 
     date: "2016-10-31T02:35:37.587Z" 
    }, { 
     id: "2", 
     quantity: "5", 
     date: "2016-10-31T02:35:37.587Z" 
    }, { 
     id: "1", 
     quantity: "4", 
     date: "2016-11-01T03:42:22.711Z" 
    }, { 
     id: "2", 
     quantity: "0", 
     date: "2016-11-01T03:42:22.711Z" 
    }, { 
     ... 

Die JSON wird aus einer Datenbank MongoDB kommen. Ich kann es leicht Dump an folgenden csv:

id | quantity | date 
------------------------------------------------------------------ 
1 |  3  |  2016-10-31T02:35:37.587Z 
2 |  5  |  2016-10-31T02:35:37.587Z 
1 |  4  |  2016-11-01T03:42:22.711Z 
2 |  0  |  2016-11-01T03:42:22.711Z 

Aber was ich wirklich will tabellarische Daten, die wie folgt aussieht:

id | 2016-10-31T02:35:37.587Z | 2016-11-01T03:42:22.711Z 
------------------------------------------------------------------ 
1 |    3    |    4 
2 |    5    |    0 

Alle Ideen, wie diese letzte Tabelle zu erreichen? Ich bin offen für Operationen auf MongoDB oder auf der gedumpten CSV-Datei mit PostgreSQL (Ich habe versucht, mit Kreuztabelle für diese, aber es konnte nicht funktionieren).

Beachten Sie, dass dies ein großer Datensatz mit 600.000 Zeilen ist.

Antwort

1

können Sie dies mit einem kleinen js-Skript tun. Es funktioniert mit den Daten, die Sie zur Verfügung gestellt haben, aber damit es "out of the box" funktioniert, müssen Sie sicherstellen, dass Sie für jede ID die gleiche Anzahl unterschiedlicher Daten haben. Wenn dies nicht der Fall ist, können Sie das Skript problemlos ändern.

script.js: (Tab getrennt cvs erzeugen, sondern kann Änderung sein, was auch immer Sie wollen)

// aggregation query, group by id and push other fiels in an array 
var cursor = db.collection.aggregate([ 
      {$group: 
      { _id: "$id", 
       date: {$push: "$date"}, 
       quantity: {$push: "$quantity"} 
      } 
      }]) 

// after this cursor content looks like 
// { "_id" : "2", "date" : [ "2016-10-31T02:35:37.587Z", "2016-11-01T03:42:22.711Z" ], "quantity" : [ "5", "0" ] } 
// { "_id" : "1", "date" : [ "2016-10-31T02:35:37.587Z", "2016-11-01T03:42:22.711Z" ], "quantity" : [ "3", "4" ] } 


var item; 
var headers; 
var content; 
var nb = -1; 

// iterate over the results 
while (cursor && cursor.hasNext()){ 
    item = cursor.next(); 
    // print headers 
    if (nb<0){ 
    headers = 'id'; 
     for (var i =0; i<item.date.length; i++) { 
     headers += '\t' + item.date[i]; 
     } 
    print(headers); 
    nb++; 
    } 
    // print content 
    content = item._id; 
    for (var j=0; j<item.quantity.length; j++){ 
    content += '\t' + item.quantity[j]; 
    } 
    print('\n' +content); 
} 

es zu benutzen, geben Sie diesen Befehl ein:

mongo dbName --quiet < script.js 

dies drucken

id 2016-10-31T02:35:37.587Z 2016-11-01T03:42:22.711Z 

2 5 0 

1 3 4 

so können Sie in eine Ausgabedatei wie schreiben dies (auf UNIX wie OS)

mongo dbName --quiet <script.js> output.csv 
+0

Funktioniert perfekt. Ich habe gerade das '' \ n'' in der vorletzten Zeile entfernt, weil es leere Zeilen in der .csv-Datei hinzugefügt hat. – bplmp