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?

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

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


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.


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;

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


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


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>..."

-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


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

-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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.