Respostas:
O shell oferece alguns recursos interessantes, mas ocultos, porque é um ambiente interativo.
Quando você executa comandos de um arquivo javascript por meio do mongo commands.js, você não obterá um comportamento totalmente idêntico.
Existem duas maneiras de contornar isso.
(1) falsificar o shell e fazê-lo pensar que você está no modo interativo
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
ou
(2) usar Javascript para traduzir o resultado de um find()
em um JSON imprimível
mongo dbname command.js > output.json
onde command.js contém isto (ou seu equivalente):
printjson( db.collection.find().toArray() )
Isso imprimirá bastante o array de resultados, incluindo [ ]
- se você não quiser, pode iterar sobre o array e printjson()
cada elemento.
A propósito, se você estiver executando apenas uma única instrução Javascript, não precisa colocá-la em um arquivo e, em vez disso, pode usar:
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
mas me deu JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Como você está fazendo isso em um terminal e deseja apenas inspecionar um registro de maneira sã, você pode usar um truque como este:
mongo | tee somefile
Use a sessão normalmente - db.collection.find().pretty()
ou o que quer que você precise fazer, ignore a saída longa e saia. Uma transcrição de sua sessão estará no arquivo em que você tee
escreveu.
Esteja ciente de que a saída pode conter sequências de escape e outro lixo devido ao shell do mongo esperar uma sessão interativa. less
lida com isso graciosamente.
Basta colocar os comandos que deseja executar em um arquivo, depois passá-los para o shell junto com o nome do banco de dados e redirecionar a saída para um arquivo. Portanto, se o seu comando find estiver find.js
e o seu banco de dados estiver foo
, terá a seguinte aparência:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
funcionou.
Coloque sua consulta (por exemplo db.someCollection.find().pretty()
) em um arquivo javascript, digamos query.js
. Em seguida, execute-o no shell do seu sistema operacional usando o comando:
mongo yourDb < query.js > outputFile
O resultado da consulta estará no arquivo denominado 'outputFile'.
Por padrão, o Mongo imprime os primeiros 20 documentos IIRC. Se você quiser mais, pode definir um novo valor para o tamanho do lote no shell do Mongo, por exemplo
DBQuery.shellBatchSize = 100
.
.js
extensão. Você pode escrever todas aquelas consultas de shell mongo sem alterá-las.
Usando print
e JSON.stringify
você pode simplesmente produzir um resultado válido JSON
.
Use o --quiet
sinalizador para filtrar o ruído do shell da saída.
Use --norc
sinalizador para evitar .mongorc.js
avaliação. (Tive que fazer isso por causa de um formatador bonito que uso, que produz uma saída JSON inválida ) Use a DBQuery.shellBatchSize = ?
substituição ?
pelo limite do resultado real para evitar paginação.
E, finalmente, use tee
para canalizar a saída do terminal para um arquivo:
// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json
// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
print(JSON.stringify(data, null, 2));
}
toPrint(
db.getCollection('myCollection').find().toArray()
);
Espero que isto ajude!
Usando esta resposta de Asya Kamsky, escrevi um script de bat de uma linha para Windows. A linha se parece com esta:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Então, pode-se executá-lo:
exportToJson.bat DbName CollectionName
Também há mongoexport para isso, mas não tenho certeza de qual versão está disponível.
Exemplo:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
você pode usar este comando para alcançá-lo:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json