Plus précisément, je souhaite imprimer les résultats d'un mongodb find()
dans un fichier. L'objet JSON est trop grand, je ne peux donc pas afficher l'objet entier avec la taille de la fenêtre shell.
la source
Plus précisément, je souhaite imprimer les résultats d'un mongodb find()
dans un fichier. L'objet JSON est trop grand, je ne peux donc pas afficher l'objet entier avec la taille de la fenêtre shell.
Le shell fournit des fonctionnalités intéressantes mais cachées car c'est 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 cela.
(1) simulez le shell et faites-lui croire que vous êtes en mode interactif
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
ou
(2) utiliser Javascript pour traduire le résultat d'un find()
en un JSON imprimable
mongo dbname command.js > output.json
où command.js contient ceci (ou son équivalent):
printjson( db.collection.find().toArray() )
Cela affichera assez bien le tableau des résultats, y compris [ ]
- si vous ne voulez pas que vous puissiez parcourir le tableau et printjson()
chaque élément.
Au fait, si vous exécutez une seule instruction Javascript, vous n'avez pas à la mettre dans un fichier et à la place, vous pouvez utiliser:
$ 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
mais ça m'a donnéJavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.Puisque vous faites cela sur un terminal et que vous voulez simplement inspecter un enregistrement d'une manière saine, vous pouvez utiliser une astuce comme celle-ci:
Utilisez la session comme d'habitude -
db.collection.find().pretty()
ou quoi que vous ayez à faire, ignorez la sortie longue et quittez. Une transcription de votre session sera dans le fichiertee
écrit.N'oubliez pas que la sortie peut contenir des séquences d'échappement et d'autres déchets en raison du mongo shell attend une session interactive.
less
gère ces gracieusement.la source
Mettez simplement les commandes que vous souhaitez exécuter dans un fichier, puis transmettez-le au shell avec le nom de la base de données et redirigez la sortie vers un fichier. Donc, si votre commande find est dans
find.js
et que votre base de données l'estfoo
, cela ressemblerait à ceci:la source
out.json
.mongo foo < find.js > out.json
a fonctionné.Mettez votre requête (par exemple
db.someCollection.find().pretty()
) dans un fichier javascript, disonsquery.js
. Ensuite, exécutez-le 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 IIRC. Si vous en voulez plus, vous pouvez définir une nouvelle valeur pour la taille du lot dans Mongo shell, par exemple
DBQuery.shellBatchSize = 100
.la source
.js
extension. Vous pouvez écrire toutes ces belles requêtes shell mongo sans les changer du tout.En utilisant
print
et,JSON.stringify
vous pouvez simplement produire un résultat valideJSON
.Utilisez un
--quiet
drapeau pour filtrer le bruit du shell de la sortie.Utilisez un
--norc
drapeau pour éviter l'.mongorc.js
évaluation. (J'ai dû le faire à cause d'un joli formateur que j'utilise, qui produit une sortie JSON invalide ) Utilisez leDBQuery.shellBatchSize = ?
remplacement?
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:J'espère que cela t'aides!
la source
En utilisant cette réponse d'Asya Kamsky, j'ai écrit un script de batte d'une ligne pour Windows. La ligne ressemble à ceci:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Ensuite, on peut l'exécuter:
exportToJson.bat DbName CollectionName
la source
J'ai réussi à enregistrer le résultat avec la fonction writeFile () .
La version du shell Mongo était 4.0.9
la source
Il existe également mongoexport pour cela, mais je ne sais pas depuis quelle version il est disponible.
Exemple:
la source
Comme réponse de Neodan, mongoexport est très utile avec une
-q
option de requête. Il convertit égalementObjectId
au format standard de JSON"$oid"
. Par exemple:la source
vous pouvez utiliser cette commande pour y parvenir:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json
la source