Como exportar a coleção para CSV no MongoDB?

98

Como você exporta todos os registros em uma coleção do MongoDB para um .csvarquivo?

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

Isso me pede para especificar o nome dos campos que preciso exportar. Posso apenas exportar todos os campos sem especificar os nomes dos campos?

Sucesso Stha
fonte

Respostas:

113

@ karoly-horvath está certo. Os campos são obrigatórios para csv.

De acordo com esse bug no rastreador de problemas do MongoDB https://jira.mongodb.org/browse/SERVER-4224, você DEVE fornecer os campos ao exportar para um csv . Os documentos não são claros sobre isso. Essa é a razão do erro.

Experimente isto:

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

ATUALIZAR:

Este commit: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 corrige os documentos para 3.0.0-rc10 e posterior. Isso muda

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

para

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

VERSÃO 3.0 E ACIMA:

Você deve usar em --type=csvvez de, --csvuma vez que se tornou obsoleto.

Mais detalhes: 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
Campeterson
fonte
16
A partir da versão 3.0.6 mongoexportdizcsv flag is deprecated; please use --type=csv instead
Roman Dibikhin
Obrigado (para anônimo) pela edição da VERSÃO 3.0 E ACIMA.
Campeterson
4
existe uma maneira rápida de incluir todos os campos em vez de nomear cada um?
Kevz
53

Além disso, não são permitidos espaços entre nomes de campo separados por vírgula.

RUIM: -f firstname, lastname

BOA: -f firstname,lastname

murphsp1
fonte
27
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

Você tem que especificá-lo manualmente e se você pensar sobre isso, faz todo o sentido. O MongoDB não tem esquema; O CSV, por outro lado, possui um layout fixo para colunas. Sem saber quais campos são usados ​​em diferentes documentos, é impossível gerar o dump CSV.

Se você tiver um esquema fixo, talvez possa recuperar um documento, coletar os nomes de campo dele com um script e passá-lo para mongoexport.

Karoly Horvath
fonte
1
Eu estava apenas procurando se poderia obter a lista de campos do registro a. ou seja, de db.collection.finOne (). getFields (). Mas acho que esse não é o método certo (getFields). Tentei getKeys () também. Caso contrário, terei que obter o registro com hashes de chave: valor.
Sucesso em Stha em
Estou tentando fazer a mesma coisa, mas descobrir por que não importa arquivos csv corretamente. No meu caso, preciso que me diga tudo sobre si mesmo, incluindo quais campos ele "inventou" por si mesmo. Portanto, no meu caso, não faz todo o sentido ter que especificar os campos, porque não sei o que são todos!
Stephen,
Sobre o roteiro de colheita de campo, postei isso há cerca de um ano, posso dar algumas idéias.
arober11
9

Se desejar, você pode exportar todas as coleções para csv sem especificar --fields(exportará todos os campos).

Em http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ execute este 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;
Michael
fonte
4
O único problema com o script acima é que ele assume que o primeiro documento de cada coleção contém todas as chaves possíveis que podem aparecer em um documento dessa coleção; o que pode não ser o caso se o tipo de documento puder conter uma matriz ou um subdocumento aninhado.
arober11
@ arober11 você está certo, esqueci de mencionar esse fato importante. O que eu normalmente faço é executar um script de redução de mapa para coletar todas as chaves periodicamente e usá-lo para extrair todas as chaves
Michael
3

Não consegui que a mongoexport fizesse isso por mim. Descobri que, para obter uma lista exaustiva de todos os campos, você precisa percorrer toda a coleção uma vez. Use isso para gerar os cabeçalhos. Em seguida, faça um loop pela coleção novamente para preencher esses cabeçalhos para cada documento.

Eu escrevi um script para fazer exatamente isso. Converter documentos do MongoDB em csv, independentemente das diferenças de esquema entre documentos individuais.

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

Suryakumar Sudar
fonte
2

Além disso, se você deseja exportar campos json internos, use ponto (operador.).

Registro JSON:

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

Comando mongoexport com operador ponto (usando mongo versão 3.4.7):

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

Saída csv:

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

Nota: Certifique-se de não exportar uma matriz. Isso corromperia o formato CSV, como os userIds de campo mostrados acima

Lokendra Chauhan
fonte
0

Solução para usuários MongoDB Atlas!

Adicione o --fieldsparâmetro como nomes de campo separados por vírgula entre aspas duplas invertidas:

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

Este é um exemplo 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>..."
Zameer Ansari
fonte
-1

Isso está funcionando para mim Experimente

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

Acima cmd retorna dados inteiros da coleção de usuários se você deseja filtrar o campo, então adicione --fields = email, nome

Manoj Patel
fonte
Como isso difere das respostas abaixo?
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 yourpassword você pode tentar isso também dá a você coleções inteiras.
manoj patel
-1

funciona para mim remotamente para um contêiner docker com 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
user739313
fonte
-2

Comando abaixo usado para exportar a coleção para o formato CSV.

Nota: naagé banco de dados, employee1_jsoné uma coleção.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
Naag
fonte
isto é o que o mongodb 4 retorna: Falha: o modo CSV requer uma lista de campos
SEXTA
-2

Para todos aqueles que estão presos a um erro.

Deixe-me dar a vocês uma solução com uma breve explicação do mesmo: -

comando para conectar: ​​-

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 do servidor Mongo

--port -> porta do servidor Mongo

-u -> nome de usuário

-p -> senha

--db -> db do qual você deseja exportar

--collection -> coleção que você deseja exportar

--type -> tipo de exportação no meu caso CSV

--out -> nome do arquivo onde você deseja exportar

--fields -> todos os campos que você deseja exportar (não dê espaços entre dois nomes de campo entre vírgulas no caso de CSV)

--authenticationDatabase -> banco de dados onde todas as suas informações de usuário são armazenadas

oficialrahulmandal
fonte