web-dev-qa-db-fra.com

Existe-t-il un moyen d’imprimer joliment la sortie de MongoDB Shell dans un fichier?

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

89
viper

Le shell 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, votre comportement ne sera pas identique.

Il y a deux façons de contourner cela.

(1) simuler le shell et lui faire croire que vous êtes en mode interactif

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

ou
(2) utilise 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 plutôt imprimer le tableau de résultats, y compris [ ] - si vous ne voulez pas que vous puissiez parcourir le tableau et printjson() chaque élément.

En passant, si vous exécutez une seule instruction Javascript, vous n'avez pas besoin de la mettre dans un fichier. Vous pouvez plutôt utiliser:

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

Comme vous le faites sur un terminal et que vous voulez juste inspecter un enregistrement de manière saine, vous pouvez utiliser une astuce comme celle-ci:

mongo | tee somefile

Utilisez la session normalement - db.collection.find().pretty() ou selon ce que vous devez faire, ignorez la sortie longue et quittez. Une transcription de votre session sera dans le fichier que 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 attend une session interactive. less les gère avec élégance.

27
Falcon Momot

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

./mongo foo find.js >> out.json
12
Adam Comerford

Placez votre requête (par exemple, db.someCollection.find().pretty()) dans un fichier javascript, disons query.js. Puis exécutez-le dans le shell de votre système d'exploitation à l'aide de la commande suivante:

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 IIRC. Si vous en voulez plus, vous pouvez définir une nouvelle valeur en fonction de la taille du lot dans Mongo Shell, par exemple. 

DBQuery.shellBatchSize = 100.

7
JohnP

En utilisant print et JSON.stringify, vous pouvez simplement produire un résultat valide JSON.
Utilisez le drapeau --quiet pour filtrer le bruit du shell de la sortie.
Utilisez le drapeau --norc pour éviter l’évaluation de .mongorc.js. (Je devais le faire à cause d'un joli formateur que j'utilise, qui produit JSON invalide sortie) Utilisez DBQuery.shellBatchSize = ? en remplaçant ? par 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 t'aides!

3
Dmitry

Il y a aussi mongoexport pour cela, mais je ne sais pas depuis quelle version il est disponible.

Exemple:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
1
Neodan

Comme answer par Neodan, mongoexport est très utile avec l’option -q pour la requête. Il convertit également ObjectId au format standard de JSON "$oid". Par exemple:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
0
Nhan D Le

J'ai réussi à enregistrer le résultat avec writeFile () function.

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

La version de Mongo Shell était 4.0.9

0
Pavel_H