Impression de la sortie de requête Mongo vers un fichier dans l'interpréteur de commandes mongo
2 jours avec Mongo et j'ai un arrière-plan SQL donc supporte avec moi. Comme avec mysql, il est très pratique d'être dans la ligne de commande MySQL et de produire les résultats d'une requête à un fichier sur la machine. J'essaie de comprendre comment je peux faire la même chose avec Mongo, tout en étant dans la coquille
je peux facilement obtenir la sortie d'une requête que je veux en étant en dehors du shell et en exécutant la commande suivante:
mongo localhost:27017/dbname --eval "printjson(db.collectionName.findOne())" >> sample.json
le chemin ci-dessus est bien, mais il me demande de sortir du shell mongo ou d'ouvrir un nouvel onglet terminal pour exécuter cette commande. Il serait très pratique si je pouvais simplement faire ceci tout en restant à l'intérieur de la coquille.
P. S: la Question est un dérivé d'une question que j'ai posté sur SO
5 réponses
AFAIK, il n'y a pas d'option interactive pour la sortie au fichier, il y a une question précédente liée à cela: impression sortie de l'interpréteur de commandes mongodb au fichier
cependant, vous pouvez enregistrer toute la session du shell si vous avez invoqué le shell avec la commande tee:
$ mongo | tee file.txt
MongoDB shell version: 2.4.2
connecting to: test
> printjson({this: 'is a test'})
{ "this" : "is a test" }
> printjson({this: 'is another test'})
{ "this" : "is another test" }
> exit
bye
alors vous obtiendrez un fichier avec ce contenu:
MongoDB shell version: 2.4.2
connecting to: test
> printjson({this: 'is a test'})
{ "this" : "is a test" }
> printjson({this: 'is another test'})
{ "this" : "is another test" }
> exit
bye
Pour supprimer toutes les commandes et ne garder que la sortie json, vous pouvez utiliser une commande similaire à:
tail -n +3 file.txt | egrep -v "^>|^bye" > output.json
alors vous obtiendrez:
{ "this" : "is a test" }
{ "this" : "is another test" }
si vous invoquez le shell avec script-file, db address ,et -- quiet arguments, vous pouvez rediriger la sortie (faite avec print () par exemple) vers un fichier:
mongo localhost/mydatabase --quiet myScriptFile.js > output
Nous pouvons le faire de cette façon -
mongo db_name --quiet --eval 'DBQuery.shellBatchSize = 2000; db.users.find({}).limit(2000)' > users.json
l'argument shellBatchSize
est utilisé pour déterminer le nombre de lignes que le client mongo est autorisé à imprimer. Sa valeur par défaut est 20.
il peut vous être utile d'augmenter simplement le nombre de résultats affichés ""
dans la coquille de mongo >
DBQuery.shellBatchSize = 3000
et ensuite vous pouvez sélectionner tous les résultats à partir du terminal dans un seul aller et coller dans un fichier texte.
C'est ce que je vais faire :)
combinant plusieurs conditions:
- écriture de mongo de requête dans le fichier JS et l'envoyer à partir de la borne
- commutateur/définir une base de données par programmation
- sortie tous les enregistrements trouvés
- lignes de sortie initiales coupées
- enregistrer la sortie dans le fichier JSON
myScriptFile.js
// Switch current database to "mydatabase"
db = db.getSiblingDB('mydatabase');
// The mark for cutting initial output off
print("CUT_TO_HERE");
// Main output
// "toArray()" method allows to get all records
printjson( db.getCollection('jobs').find().toArray() );
envoi de la requête à partir du terminal
-z
clé de sed
permet de traiter la sortie comme une seule chaîne multi-ligne
$> mongo localhost --quiet myScriptFile.js | sed -z 's/^.*CUT_TO_HERE\n//' > output.json