109 votes

Existe-t-il un moyen d'imprimer joliment la sortie du shell MongoDB dans un fichier ?

Plus précisément, je veux imprimer les résultats d'un mongodb find() à un fichier. L'objet JSON est trop volumineux et je ne suis pas en mesure de l'afficher dans son intégralité avec la taille de la fenêtre du shell.

228voto

Asya Kamsky Points 18076

L'interpréteur de commandes offre des fonctionnalités intéressantes mais cachées, car il s'agit d'un environnement interactif.

Lorsque vous exécutez des commandes à partir d'un fichier javascript via mongo commands.js, vous n'obtiendrez pas un comportement tout à fait identique.

Il y a deux façons de contourner ce problème.

(1) simulez la coquille et faites-lui croire que vous êtes en mode interactif.

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

ou
(2) utiliser le Javascript pour traduire le résultat d'un find() en un fichier JSON imprimable

mongo dbname command.js > output.json

où command.js contient ceci (ou son équivalent) :

printjson( db.collection.find().toArray() )

Cela va imprimer le tableau des résultats, y compris les suivants [ ] - si vous ne voulez pas cela vous pouvez itérer sur le tableau et printjson() chaque élément.

Au fait, si vous n'exécutez qu'une seule instruction Javascript, vous n'avez pas besoin de la mettre dans un fichier et vous pouvez utiliser :

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

30voto

Falcon Momot Points 467

Étant donné que vous effectuez cette opération sur un terminal et que vous souhaitez simplement inspecter un enregistrement de manière sensée, vous pouvez utiliser une astuce comme celle-ci :

mongo | tee somefile

Utilisez la session comme d'habitude - db.collection.find().pretty() ou ce que vous devez faire, ignorez la longue sortie, et quittez. Une transcription de votre session sera dans le fichier tee a écrit à.

N'oubliez pas que la sortie peut contenir des séquences d'échappement et d'autres déchets, car le shell mongo s'attend à une session interactive. less les gère avec élégance.

13voto

Adam Comerford Points 9084

Il suffit de placer les commandes que vous voulez exécuter dans un fichier, puis de le passer au shell avec le nom de la base de données et de rediriger la sortie vers un fichier. Ainsi, si votre commande find est dans find.js et votre base de données est foo cela ressemblerait à ceci :

./mongo foo find.js >> out.json

12voto

JohnP Points 521

Mettez votre requête (par exemple db.someCollection.find().pretty() ) dans un fichier javascript, par exemple query.js . Exécutez-le ensuite dans le shell de votre système d'exploitation en utilisant la commande :

mongo yourDb < query.js > outputFile

Le résultat de la requête sera dans le fichier nommé 'outputFile'.

Par défaut, Mongo imprime les 20 premiers documents. Si vous en voulez plus, vous pouvez définir une nouvelle valeur pour la taille du lot dans le shell Mongo, par ex.

DBQuery.shellBatchSize = 100 .

6voto

Dmitry Points 166

Utilisation de print y JSON.stringify vous pouvez simplement produire un valide JSON résultat.
Utilisez --quiet pour filtrer le bruit des coquilles de la sortie.
Utilisez --norc drapeau à éviter .mongorc.js évaluation. (J'ai dû le faire à cause d'un joli formateur que j'utilise et qui produit JSON invalide sortie) Utiliser DBQuery.shellBatchSize = ? remplacement de ? avec la limite du résultat réel pour éviter la pagination.

Et enfin, utilisez tee pour diriger la sortie du terminal vers un fichier :

// 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()
);

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X