2013-01-23 15 views
51

Sto utilizzando MongoDB 2.2.2 per la macchina Windows7 a 32 bit. Ho una query di aggregazione complessa in un file .js. Ho bisogno di eseguire questo file sulla shell e indirizzare l'output in un file CSV. Mi assicuro che la query restituisca un json "flat" (senza chiavi annidate), quindi è intrinsecamente convertibile in un csv pulito.

Conosco load() e eval(). eval() mi richiede di incollare l'intera query nella shell e consente solo lo printjson() all'interno dello script, mentre ho bisogno di csv. E, il secondo modo: load() .. Stampa l'output sullo schermo e di nuovo in formato json.

C'è un modo in cui Mongo può eseguire questa conversione da json a csv? (Ho bisogno del file CSV per preparare i grafici sui dati). Sto pensando:

1. O mongo ha un comando incorporato per questo che non riesco a trovare adesso.
2. Mongo non può farlo per me; Posso al massimo inviare l'output JSON a un file che poi ho bisogno di convertire in CSV me stesso.
3. Mongo può inviare l'output JSON a una raccolta temporanea, il cui contenuto può essere facilmente mongoexported in formato csv. Ma penso che solo le query di riduzione della mappa supportino le raccolte di output. È giusto? Ne ho bisogno per una query di aggregazione.Reindirizzare l'output della query mongo in un file csv

Grazie per qualsiasi aiuto :)

+1

Se questo è qualcosa che non di frequente, si potrebbe non crei un'EXE standalone utilizzando .NET , python, o potresti usare NodeJs; ognuno ha un driver nativo che renderebbe facile l'esecuzione del codice e produrre l'output desiderato. – WiredPrairie

+0

Mi riferisco alla risposta di Zachary sulla http://stackoverflow.com/questions/4130849/convert-json-format-to-csv-format-for-ms-excel e sono in grado di convertire da JSON in formato CSV. Ma come alternativa, posso inviare il json a una raccolta e poi fare un mongoexport? –

+0

vi consiglio solo di costruire una piccola imbracatura utilizzando Node e il driver MongoDB per NodeJS e quindi è possibile eseguire qualsiasi codice vuoi. Otterrai i risultati desiderati molto rapidamente senza aver bisogno del guscio. Sarebbe molto mantenibile (e debugabile). – WiredPrairie

risposta

114

So che questa domanda è vecchia, ma trascorro un'ora cercando di esportare una query complessa in csv e volevo condividere i miei pensieri. Per prima cosa non sono riuscito a far funzionare nessuno dei convertitori json to csv (anche se lo this sembrava promettente). Quello che ho finito è stato scrivere manualmente il file csv nel mio script mongo.

Questa è una versione semplice ma essenzialmente quello che ho fatto:

print("name,id,email"); 
db.User.find().forEach(function(user){ 
    print(user.name+","+user._id.valueOf()+","+user.email); 
}); 

Questo ho appena convogliato la query per stdout

mongo test export.js > out.csv 

dove test è il nome del database che uso.

+0

Come dovrei specificare in che cosa si trova la raccolta utente in db? – Nelu

+2

@NeluMalancea controlla MongoDB [docs] (http://docs.mongodb.org/manual/tutorial/getting-started-with-the-mongo-shell/) hanno queste informazioni. È possibile specificare il DB aggiungendo "use " all'inizio dello script – GEverding

+2

In realtà, poiché gli helper di shell come "use " non sono javascript, non sono consentiti. Vedi http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/. Invece, avvia il tuo script qualcosa come questo: conn = new Mongo(); db = conn.getDB ('your_db_name'); –

5

Date un'occhiata al this

per outputing da shell mongo file. Non c'è supporto per l'output di csv dalla shell mongos. Dovresti scrivere tu stesso la javascript o utilizzare uno dei tanti convertitori disponibili. Google "converti json in csv" per esempio.

5

Ecco cosa si può provare:

print("id,name,startDate") 
cursor = db.<collection_name>.find(); 
while (cursor.hasNext()) { 
    jsonObject = cursor.next(); 
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"") 

} 

Salva che in un file, dire "export.js". Eseguire il seguente comando:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv 
49

di Mongo in-built export sta lavorando bene, a meno che non si desidera qualsiasi manipolazione di dati come il formato della data, i tipi di dati sotto copertura ecc

seguito comando funziona come fascino.

mongoexport -h localhost -d databse -c collection --csv 
--fields erpNum,orderId,time,status 
-q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
--out report.csv 
+0

È fantastico! –

+8

Grazie mille! Suggerimento: ora è '--type = csv' invece di' --csv'. – Jan

0

Estendere altre risposte:

ho trovato @ risposta di GEverding più flessibile.Funziona anche con l'aggregazione:

test_db.js

print("name,email"); 

db.users.aggregate([ 
    { $match: {} } 
]).forEach(function(user) { 
     print(user.name+","+user.email); 
    } 
}); 

Eseguire il seguente comando per esportare i risultati:

mongo test_db <./test_db.js>> ./test_db.csv 

Purtroppo, aggiunge il testo aggiuntivo al file CSV, che richiede l'elaborazione il file prima che possiamo usarlo:

MongoDB shell version: 3.2.10 
connecting to: test_db 

Ma possiamo fare di shell mongo smettere di sputare quei commenti e stampare solo ciò che abbiamo chiesto facendo passare il --quiet bandiera

mongo --quiet test_db <./test_db.js>> ./test_db.csv