2013-05-09 17 views
20

Chcę zapisać wynik z agregacji do pliku csv.Eksport agregatów mongoexport do pliku CSV

Korzystanie z cmd Mongo narzędziem wiersza mogę to zrobić, aby uzyskać wyniki, które chcę:

db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }} 

Jak bym przetłumaczyć to na polecenie mongoexport który zapisuje wyniki do pliku CSV?

+2

FYI, 'mongoexport' ma opcję' --query', ale nie obsługuje złożonych zapytań takich jak twoje. – alecxe

+0

, więc nie ma sposobu, aby to zrobić? – Baconator507

Odpowiedz

7

Nie można uruchomić kwerendy aggregate() przez mongoexport. Narzędzie mongoexport jest przeznaczone do bardziej podstawowego eksportu danych z filtrem zapytań, a nie do pełnej agregacji i przetwarzania danych. Możesz jednak napisać krótki skrypt używając swojego ulubionego language driver dla MongoDB.

36

można wyeksportować do pliku CSV z 3 następujących etapów:

  1. Przypisywanie wyniki agregacji do zmiennej (reference):

    var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }} 
    
  2. wstawić wartość zmiennej do nowa kolekcja:

    db.bar.insert(result.result); 
    
  3. W terminalu (lub wiersza polecenia) wyeksportować bar kolekcję do pliku CSV:

    mongoexport -d yourdbname -c bar -f _id,total --csv > results.csv 
    

... i gotowe :)

+11

Kroki 1 i 2 można łączyć z MongoDB 2.6 przy użyciu operatora $ out w trybie zagregowanym. Zobacz http://stackoverflow.com/questions/13612028/export-mongodb-aggregation-framework-result-to-a-new-collection/19600746#19600746. – Philippe

+1

Jest to bardzo pomocne dla osób, które wciąż trzymają się z 2.4 na swoich serwerach. Rewizja. – user1589754

+3

Wierzę, że krok drugi powinien być db.bar.insert (result.toArray()); –

9

Jeśli nie chcą zapisz wyniki w kolekcji, możesz również napisać bezpośrednio do pliku CSV z JavaScript za pomocą funkcji drukowania. Zapisz następujący skrypt w pliku takim jak exportCompras.js.

var cursor = db.compras.aggregate({ $group : 
    { _id : "$data.proponente", 
    total : { $sum : "$price" } 
    } 
}); 

if (cursor && cursor.hasNext()) { 

    //header 
    print('proponente,total'); 

    while (cursor.hasNext()) { 
    var item = cursor.next(); 
    print('"' + item._id + '",' + item.total); 
    //printjson(cursor.next()); -- or if you prefer the JSON 
    } 

} 

z linii poleceń wywołać

exportCompras.js Mongo server/Kolekcja> comprasResults.csv --quiet

33

Nieco prostsza opcja jak z 2.6+ jest teraz dodać $ out krok do twojego agregatu, aby umieścić wyniki w kolekcji:

db.collection.aggregate([ { aggregation steps... }, { $out : "results" } ]) 

Następnie wystarczy użyć mongoexport

mongoexport -d database -c results -f field1,field2,etc --csv > results.csv 

Po tym może chcesz usunąć kolekcję tymczasową z bazy danych, tak, że nie należy korzystać niepotrzebnych zasobów, a także aby uniknąć nieporozumień później, gdy użytkownik zapomniał, dlaczego ta kolekcja istnieje w twojej bazie danych.

db.results.drop() 
+3

To powinna być zaakceptowana odpowiedź – Mika

1

podjąć następujące i zapisać go na serwerze Mongo gdzieś:

// Export to CSV function 
DBCommandCursor.prototype.toCsv = function(deliminator, textQualifier) 
{ 
    var count = -1; 
    var headers = []; 
    var data = {}; 

    deliminator = deliminator == null ? ',' : deliminator; 
    textQualifier = textQualifier == null ? '\"' : textQualifier; 

    var cursor = this; 

    while (cursor.hasNext()) { 

     var array = new Array(cursor.next()); 

     count++; 

     for (var index in array[0]) { 
      if (headers.indexOf(index) == -1) { 
       headers.push(index); 
      } 
     } 

     for (var i = 0; i < array.length; i++) { 
      for (var index in array[i]) { 
       data[count + '_' + index] = array[i][index]; 
      } 
     } 
    } 

    var line = ''; 

    for (var index in headers) { 
     line += textQualifier + headers[index] + textQualifier + deliminator; 
    } 

    line = line.slice(0, -1); 
    print(line); 

    for (var i = 0; i < count + 1; i++) { 

     var line = ''; 
     var cell = ''; 
     for (var j = 0; j < headers.length; j++) { 
      cell = data[i + '_' + headers[j]]; 
      if (cell == undefined) cell = ''; 
      line += textQualifier + cell + textQualifier + deliminator; 
     } 

     line = line.slice(0, -1); 
     print(line); 
    } 
} 

Następnie można uruchomić następujące polecenia przez powłokę lub GUI jak Robomongo:

load('C:\\path\\to\\your\\saved\\js\\file') 
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();