2016-11-03 2 views
0

У меня есть некоторые данные в формате JSON, который выглядит следующим образом:JSON из MongoDB на CSV, затем переставлять строки

[{ 
     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" 
    }, { 
     ... 

JSON выходит из базы данных MongoDB. Я могу легко сбросить его к следующему 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 

Но то, что я действительно хочу, табличные данные, выглядит следующим образом:

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

Любые идеи о том, как достичь этой последней таблицы? Я открыт для выполнения операций на MongoDB или на сбрасываемом CSV-файле с использованием PostgreSQL (я пытался использовать кросс-таблицу для этого, но не мог заставить его работать).

Имейте в виду, что это большой набор данных с 600 тыс. Строк.

ответ

1

вы можете сделать это с помощью небольшого js-скрипта. Он работает с данными, которые вы предоставили, но чтобы заставить его работать «из коробки», вам нужно убедиться, что у вас одинаковое количество разных дат для каждого идентификатора. Однако, если это не так, вы можете легко изменить сценарий.

script.js: (генерировать вкладки разделены CVS, но может быть изменен, чтобы все, что вы хотите)

// 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); 
} 

использовать его, введите следующую команду:

mongo dbName --quiet < script.js 

отпечатывается

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

2 5 0 

1 3 4 

поэтому вы можете написать выходной файл, например это (на unix как ОС)

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

Работает отлично. Я просто удалил '' \ n'' во второй строке, потому что он добавлял пустые строки в CSV-файл. – bplmp