2013-05-09 15 views
20

Voglio salvare il risultato di un'aggregazione in un file CSV.esportazione di aggregati mongoexport in un file CSV

Utilizzando lo strumento linea di cmd mongo posso fare questo per ottenere i risultati che voglio:

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

Come potrei tradurre questo in un comando mongoexport che salva il risultato in un csv?

+2

FYI, 'mongoexport' ha l'opzione' --query', ma non supporta query complesse come la tua. – alecxe

+0

quindi non c'è modo di farlo? – Baconator507

risposta

7

Non è possibile eseguire query aggregate() tramite mongoexport. Lo strumento mongoexport è concepito per una maggiore esportazione di dati di base con un filtro di query piuttosto che un'aggregazione completa e l'elaborazione dei dati. Però potresti facilmente scrivere un breve script usando il tuo preferito language driver per MongoDB.

36

È possibile esportare in un file CSV con i seguenti 3 passi:

  1. assegnare i risultati di aggregazione ad una variabile (reference):

    var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }} 
    
  2. Inserire un valore della variabile da una nuova collezione:

    db.bar.insert(result.result); 
    
  3. Nel terminale (o riga di comando) esportare questo bar collezione in un file CSV:

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

... e il gioco è fatto :)

+11

I passaggi 1 e 2 possono essere combinati a partire da MongoDB 2.6 utilizzando l'operatore $ out su aggregato. Vedi http://stackoverflow.com/questions/13612028/export-mongodb-aggregation-framework-result-to-a-new-collection/19600746#19600746. – Philippe

+1

Questo è davvero utile per le persone ancora bloccate con 2.4 sui loro server. Upvoted. – user1589754

+3

Credo che il secondo passo dovrebbe essere db.bar.insert (result.toArray()); –

9

Se non si desidera memorizzare i risultati in una raccolta, è anche possibile scrivere direttamente in un file CSV da JavaScript utilizzando la funzione di stampa. Salva il seguente script in un file come 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 
    } 

} 

Dalla riga di comando, chiamare

exportCompras.js mongo di server/collezione> comprasResults.csv --quiet

33

scelta un po 'più semplice, come di 2.6+ è quello di aggiungere ora un passo $ out al tuo aggregato per mettere i risultati in una raccolta:

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

poi basta usare mongoexport

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

Dopo di che si potrebbe desiderare di eliminare la raccolta temporanea dal database, in modo che esso non tiene utilizzando le risorse non necessarie, e anche per evitare confusione in seguito, quando si è dimenticato perché questa collezione esiste nel tuo database.

db.results.drop() 
+3

Questa dovrebbe essere la risposta accettata – Mika

1

adottare le seguenti e salvarlo sul server mongo da qualche parte:

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

Quindi è possibile eseguire i seguenti comandi tramite il guscio o di un'interfaccia grafica simile Robomongo:

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