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.
Réponses
Trop de publicités?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
É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.
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
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
.
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 !
- Réponses précédentes
- Plus de réponses