Come esportare la raccolta in CSV in MongoDB?


100

Come si esportano tutti i record di una raccolta MongoDB in un .csvfile?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

Questo mi chiede di specificare il nome dei campi che devo esportare. Posso semplicemente esportare tutti i campi senza specificare i nomi dei campi?

Risposte:


114

@ karoly-horvath ha ragione. I campi sono obbligatori per csv.

Secondo questo bug nel tracker dei problemi di MongoDB https://jira.mongodb.org/browse/SERVER-4224 DEVI fornire i campi durante l'esportazione in un csv . I documenti non sono chiari su di esso. Questa è la ragione dell'errore.

Prova questo:

mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName

AGGIORNARE:

Questo commit: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 corregge i documenti per 3.0.0-rc10 e versioni successive. Cambia

Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`

per

Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`

VERSIONE 3.0 E SOPRA:

Dovresti usare al --type=csvposto di --csvpoiché è stato deprecato.

Maggiori dettagli: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Comando completo:

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName

16
A partire dalla versione 3.0.6 mongoexportdicecsv flag is deprecated; please use --type=csv instead
Roman Dibikhin

Grazie (ad anonimo) per la VERSIONE 3.0 E SOPRA la modifica.
campeterson

4
c'è un modo veloce per includere tutti i campi invece di nominarli?
Kevz

53

Inoltre, non sono consentiti spazi tra nomi di campi separati da virgole.

MALE: -f firstname, lastname

BENE: -f firstname,lastname


28
mongoexport  --help
....
-f [ --fields ] arg     comma separated list of field names e.g. -f name,age
--fieldFile arg         file with fields names - 1 per line

Devi specificarlo manualmente e se ci pensi, ha perfettamente senso. MongoDB è privo di schemi; CSV, d'altra parte, ha un layout fisso per le colonne. Senza sapere quali campi vengono utilizzati nei diversi documenti è impossibile generare il dump CSV.

Se hai uno schema fisso, forse potresti recuperare un documento, raccogliere i nomi dei campi da esso con uno script e passarlo a mongoexport.


1
Stavo solo cercando se potevo ottenere l'elenco dei campi dal record a. cioè da db.collection.finOne (). getFields (). Ma immagino che non sia il metodo giusto (getFields). Ho provato anche getKeys (). Altrimenti dovrò ottenere il record con key: value hash.
Successo Stha

Sto cercando di fare la stessa cosa, ma per capire perché non importa correttamente i file CSV. Nel mio caso, ho bisogno che mi dica tutto su se stesso, inclusi i campi che ha "inventato" da solo. Quindi nel mio caso non ha perfettamente senso dover specificare i campi, perché non so cosa siano tutti!
Stephen

Sul fronte della sceneggiatura campo di raccolta, ho postato questo un anno o giù di lì di nuovo, si può dare un paio di idee.
arober11

9

Se lo desideri, puoi esportare tutte le raccolte in csv senza specificarlo --fields(esporterà tutti i campi).

Da http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ esegui questo script bash

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=DBNAME
user=USERNAME
pass=PASSWORD
host=HOSTNAME:PORT

# first get all collections in the database
collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
collectionArray=($collections);

# for each collection
for ((i=0; i<${#collectionArray[@]}; ++i));
do
    echo 'exporting collection' ${collectionArray[$i]}
    # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
    keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
    # now use mongoexport with the set of keys to export the collection to csv
    mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
done

IFS=$OIFS;

4
L'unico problema con lo script precedente è che presume che il primo documento in ogni raccolta contenga tutte le chiavi possibili che potrebbero apparire in un documento in quella raccolta; il che potrebbe non essere il caso se il tipo di documento può contenere un array o un sottodocumento nidificato.
arober11

@ arober11 hai ragione, ho dimenticato di menzionare questo fatto importante. Quello che faccio di solito è eseguire uno script di riduzione della mappa per raccogliere periodicamente tutte le chiavi e usarlo per estrarre tutte le chiavi
Michael

3

Non sono riuscito a convincere mongoexport a farlo per me. Ho scoperto che, per ottenere un elenco esaustivo di tutti i campi, è necessario scorrere l'intera raccolta una volta. Usalo per generare le intestazioni. Quindi scorrere nuovamente la raccolta per popolare queste intestazioni per ogni documento.

Ho scritto una sceneggiatura per fare proprio questo. Conversione di documenti MongoDB in csv indipendentemente dalle differenze di schema tra i singoli documenti.

https://github.com/surya-shodan/mongoexportcsv


2

Inoltre, se si desidera esportare i campi JSON interni, utilizzare l'operatore punto (.).

Record JSON:

{
    "_id" : "00118685076F2C77",
    "value" : {
        "userIds" : [ 
            "u1"
        ],
        "deviceId" : "dev"
}

Comando mongoexport con operatore punto (utilizzando la versione 3.4.7 di mongo):

./mongoexport --host localhost --db myDB --collection myColl --type = csv --out out.csv --fields value.deviceId, value.userIds

Uscita csv:

value.deviceId,value.userIds
d1,"[""u1""]"
d2,"[""u2""]"

Nota: assicurati di non esportare un array. Corromperebbe il formato CSV come gli userId del campo mostrati sopra


0

Soluzione per gli utenti MongoDB Atlas!

Aggiungi il --fieldsparametro come nomi di campo separati da virgole racchiusi tra virgolette doppie invertite:

--fields "<FIELD 1>,<FIELD 2>..."

Questo è un esempio completo:

mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."

0

Questo funziona per me Provalo

mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword

Sopra cmd restituisci tutti i dati della raccolta utenti se desideri il campo del filtro, quindi aggiungi --fields = email, name


In che modo è diverso dalle risposte di seguito?
Daniel W.

mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / documents / db-12-2020 --authenticationDatabase admin --ssl --username youruname - password tua password puoi provare anche questo ti dà intere collezioni.
manoj patel

0

per me funziona in remoto su un container docker con mongo: 4.2.6

mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv

-1

Per tutti coloro che sono bloccati con un errore.

Permettetemi di darvi una soluzione con una breve spiegazione dello stesso: -

comando per connettersi: -

mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin

--host -> host del server Mongo

--port -> porta del server Mongo

-u -> nome utente

-p -> password

--db -> db da cui si desidera esportare

- raccolta -> raccolta che desideri esportare

--type -> tipo di esportazione nel mio caso CSV

--out -> nome del file in cui si desidera esportare

--fields -> tutti i campi che vuoi esportare (non dare spazi tra due nomi di campo tra virgole in caso di CSV)

--authenticationDatabase -> database in cui sono archiviate tutte le informazioni dell'utente


-2

Di seguito il comando utilizzato per esportare la raccolta in formato CSV.

Nota: naagè un database, employee1_jsonè una raccolta.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1

questo è ciò che mongodb 4 restituisce: Fallito: la modalità CSV richiede un elenco di campi
VENERDÌ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.