Como exportar JSON do MongoDB usando Robomongo

108

Portanto, não sei muito sobre MongoDB. Tenho RoboMongousando o qual me conecto a um MongoDB. O que preciso fazer é o seguinte - há uma coleção nesse MongoDB. Quero exportar os dados dessa coleção para salvá-los em um arquivo.

Usei a interface para abrir os dados da coleção como texto e fiz um Ctrl+ Ae colei em um arquivo de texto. No entanto, descobri que nem todos os dados são copiados e também que havia muitos comentários nos dados de texto que quebram naturalmente o JSON.

Gostaria de saber se o RoboMongo tem uma Export As JSONinstalação para que eu possa fazer uma exportação limpa.

Quaisquer dicas são apreciadas!

Variável indefinida
fonte
Você deseja exportar coleções específicas ou banco de dados completo?
Ramesh Murugesan
1
Este não é um recurso atual do Robomongo, mas adicionei uma sugestão de recurso na fila de problemas do github: Adicionar exportação JSON . Há uma sugestão geral de que a importação / exportação deve ser integrada , mas casos de uso mais detalhados / práticos seriam úteis. Por exemplo, isso deve suportar a exportação de JSON de uma coleção, uma consulta de localização, um pipeline de agregação? Atualmente, sua melhor opção é usar a mongoexportferramenta de linha de comando padrão .
Stennie
1
@Stennie - obrigado pelo seu comentário. Acho que em resposta à sua pergunta - do ponto de vista da experiência do cliente, isso realmente não importa. Na maioria das outras interfaces de banco de dados, o fluxo é que você execute uma consulta (com ou sem critérios), obtenha um conjunto de resultados. Clique com o botão direito e diga "exportar resultados como ..." Portanto, o mesmo deve ser aplicável aqui. Não importa se estou exportando uma coleção inteira ou uma consulta de pesquisa. Se o resultado puder ser exibido no painel, ele deve ser exportável.
Variável indefinida
1
Simplesmente você pode fazer issomongoexport --uri='mongodb://[email protected]:27017/marketing' --collection=contacts --out=contacts.json
Naren

Respostas:

63

Você pode usar tojsonpara converter cada registro em JSON em um script de shell do MongoDB .

Execute este script no RoboMongo:

var cursor = db.getCollection('foo').find({}, {});
while(cursor.hasNext()) {
    print(tojson(cursor.next()))
}

Isso imprime todos os resultados como uma matriz do tipo JSON.

O resultado não é realmente JSON! Alguns tipos, como datas e IDs de objeto, são impressos como chamadas de função JavaScript, por exemplo ISODate("2016-03-03T12:15:49.996Z"),.

Pode não ser muito eficiente para grandes conjuntos de resultados, mas você pode limitar a consulta. Alternativamente, você pode usar mongoexport.

Florian Winter
fonte
3
A saída não é json válida. Apenas registros serializados em JSON um por um
ruX
Para muitos casos de uso, pode-se usar tojson(db.getCollection(...).find(...)["_batch"])para produzir a totalidade do lote atual obtido do servidor.
Yuval
@Yuval Você quer dizer literalmente ["_batch"]? Você pode dar um exemplo de como usar isso? Tentei fazer isso com o Robo 3T 1.2.1, mas só diz "Script executado com sucesso, mas não há resultados para mostrar".
Florian Winter
7
@FlorianWinter Isso foi apenas de descobertas aleatórias de mexer por aí. A melhor solução é tojson(db.getCollection(...).find(...).toArray()).
Yuval
@Yuval Nice! Essa é a solução mais fácil então, muito melhor que a minha. Considere postar como uma resposta. (Ou editar o meu, mas então eu receberia todo o crédito que você merece, o que seria um tanto injusto ...)
Florian Winter
58

Uma maneira rápida e suja: Basta escrever sua consulta como db.getCollection('collection').find({}).toArray()e clicar com o botão direito Copy JSON. Cole os dados no editor de sua escolha.

insira a descrição da imagem aqui

öbl
fonte
4
Arrumado! Nada sujo, considerando a falta de funcionalidade de exportação no robo3t. Muito mais fácil para pequenos conjuntos de dados em comparação com outras soluções sugeridas.
Ilya Luzyanin
30

A funcionalidade do shell do Robomongo resolverá o problema. No meu caso, eu precisava de algumas colunas no formato CSV.

var cursor = db.getCollection('Member_details').find({Category: 'CUST'},{CustomerId :1,Name :1,_id:0})

while (cursor.hasNext()) {
    var record = cursor.next();   
    print(record.CustomerID + "," + record.Name)
}

Output : -------

334, Harison
433, Rechard
453, Michel
533, Pal
Anish Abraham
fonte
1
É possível escrever a saída deste script em um csv localmente dentro do shell Robomongo?
xxxvincxxx
Isso me dá "Script executado com sucesso, mas não há resultados para mostrar"
Shanika Ediriweera
Erro: Linha 10: Lado esquerdo inválido na atribuição
Eugen Sunic
19

Existem algumas GUIs do MongoDB por aí, algumas delas com suporte integrado para exportação de dados. Você encontrará uma lista abrangente de GUIs do MongoDB em http://mongodb-tools.com

Você perguntou sobre a exportação dos resultados da sua consulta, e não sobre a exportação de coleções inteiras. Experimente o 3T MongoChef MongoDB GUI , esta ferramenta tem suporte para seu caso de uso específico.

Tomek
fonte
O Studio 3T fez o trabalho mais facilmente do que o esperado! : +1:
vinyll de
16

você diz "exportar para arquivo" como em uma planilha? gosta de um .csv?

IMO, esta é a maneira MAIS FÁCIL de fazer isso no Robo 3T (antigo robomongo):

  1. No canto superior direito da GUI do Robo 3T há um botão "Exibir resultados em modo de texto", clique nele e copie tudo

  2. cole tudo neste site: https://json-csv.com/

  3. clique no botão de download e agora você tem em uma planilha.

espero que isso ajude alguém, pois eu gostaria que o Robo 3T tivesse recursos de exportação

verão russo
fonte
Muito simples, obrigado
Tính Ngô Quang
11

Não execute este comando no shell, insira este script em um prompt de comando com seu nome de banco de dados, nome de coleção e nome de arquivo, todos substituindo os marcadores de posição.

mongoexport --db (Database name) --collection (Collection Name) --out (File name).json

Funciona para mim.

Yogesh Nikam Patil
fonte
5

Ampliando a resposta de Anish, eu queria algo que pudesse aplicar a qualquer consulta para gerar automaticamente todos os campos em vez de defini-los na instrução de impressão. Provavelmente pode ser simplificado, mas foi algo rápido e sujo que funciona muito bem:

var cursor = db.getCollection('foo').find({}, {bar: 1, baz: 1, created_at: 1, updated_at: 1}).sort({created_at: -1, updated_at: -1});

while (cursor.hasNext()) {
    var record = cursor.next();
    var output = "";
    for (var i in record) {
      output += record[i] + ",";
    };
    output = output.substring(0, output.length - 1);
    print(output);
}
Mark Shust na M.academy
fonte
4

Se quiser usar o mongoimport , você desejará exportar desta forma:

db.getCollection('tables')
  .find({_id: 'q3hrnnoKu2mnCL7kE'})
  .forEach(function(x){printjsononeline(x)});
shapiromatron
fonte
2

Usando um script de shell robomongo:

//on the same db
var cursor = db.collectionname.find();

while (cursor.hasNext()) {
    var record = cursor.next();   
    db.new_collectionname.save(record);
}

Usando o comando de exportação e importação do mongodb

Você pode adicionar o --jsonArrayparâmetro / sinalizador ao seumongoexport comando, isso exporta o resultado como um único array json.

Em seguida, basta especificar o --jsonArraysinalizador novamente ao importar.

Ou remova os colchetes iniciais e finais do array [] no arquivo, então seu arquivo modificado e exportado será importado com o mongoimportcomando sem a --jsonArraybandeira.

Mais sobre Exportar aqui: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Importe aqui: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray

Herald Smit
fonte
1

Eu tive esse mesmo problema, e a execução do script no robomongo (Robo 3T 1.1.1) também não permite copiar valores e também não havia opção de exportação. A melhor maneira de conseguir isso é usar o mongoexport, se o mongodb estiver instalado em seu local, você pode usar o mongoexport para se conectar ao banco de dados em qualquer servidor e extrair dados

Para se conectar a dados no servidor remoto e arquivo de saída csv, execute o seguinte mongoexport em sua linha de comando

mongoexport --host HOSTNAME --port PORT --username USERNAME --password "PASSWORD" --collection COLLECTION_NAME --db DATABASE_NAME --out OUTPUTFILE.csv --type=csv --fieldFile fields.txt

fieldFile: ajuda a extrair as colunas desejadas, ex: o conteúdo do fields.txt pode ser apenas:

ID do usuário

para extrair apenas valores da coluna 'userId'

Dados no servidor remoto, arquivo de saída json:

mongoexport --host HOST_NAME --port PORT --username USERNAME --password "PASSWORD" --collection COLECTION_NAME --db DATABASE_NAME --out OUTPUT.json

isto extrai todos os campos para o arquivo json

dados no localhost (mongodb deve estar em execução no localhost)

mongoexport --db DATABASE_NAME --collection COLLECTION --out OUTPUT.json

Referência: https://docs.mongodb.com/manual/reference/program/mongoexport/#use

Venkata Buddhiraju
fonte
1

Solução:

mongoexport --db test --collection traffic --out traffic.json<br><br>

insira a descrição da imagem aqui

Onde:
banco de dados ->
nome da coleção do servidor mock ->
nome do arquivo de saída api_defs -> childChoreRequest.json

amoljdv06
fonte
1

Uma extensão da resposta Florian Winter para pessoas que procuram gerar uma consulta pronta para executar.

drope insertManyconsulta usando cursor:

{
    // collection name
    var collection_name = 'foo';

    // query
    var cursor = db.getCollection(collection_name).find({});

    // drop collection and insert script
    print('db.' + collection_name + '.drop();');
    print('db.' + collection_name + '.insertMany([');

    // print documents
    while(cursor.hasNext()) {
        print(tojson(cursor.next()));

        if (cursor.hasNext()) // add trailing "," if not last item
            print(',');
    }

    // end script
    print(']);');
}

Sua saída será como:

db.foo.drop();
db.foo.insertMany([
{
    "_id" : ObjectId("abc"),
    "name" : "foo"
}
,
{
    "_id" : ObjectId("xyz"),
    "name" : "bar"
}
]);
Shaharyar
fonte
0
  1. faça sua busca
  2. botão para ver os resultados no modo JSON
  3. copie o resultado para o word
  4. imprimir o resultado da palavra
Osama Beshara
fonte
Quando tenho datas em meu documento, ele retorna elementos ISODate que não são o formato json válido.
Constantino Cronemberger
1
Por que você usaria um documento do Word para armazenar uma exportação de banco de dados? E por que alguém iria querer imprimir uma exportação de banco de dados?
maesk 01 de
@maesk 🤣🤣🤣🤣
Charlie Schliesser