2 jours avec Mongo et j'ai une base de données SQL donc supportez-moi. Comme avec mysql, il est très pratique d’être dans la ligne de commande MySQL et d’afficher les résultats d’une requête dans un fichier de la machine. J'essaie de comprendre comment je peux faire la même chose avec Mongo, tout en étant dans le shell
Je peux facilement obtenir le résultat d'une requête que je souhaite en étant en dehors du shell et en exécutant la commande suivante:
mongo localhost:27017/dbname --eval "printjson(db.collectionName.findOne())" >> sample.json
La méthode ci-dessus convient, mais vous devez quitter le shell mongo ou ouvrir un nouvel onglet de terminal pour exécuter cette commande. Ce serait très pratique si je pouvais simplement faire cela tout en restant à l'intérieur de Shell.
P.S: la question est une émanation d'une question que j'ai postée sur DONC
Autant que je sache, il n’existe pas d’option interactive pour la sortie dans un fichier, il existe une précédente SO question liée à ceci: Impression de la sortie du shell mongodb dans un fichier
Cependant, vous pouvez enregistrer toute la session du shell si vous avez appelé 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
Ensuite, 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 conserver que la sortie JSON, vous pouvez utiliser une commande semblable à:
tail -n +3 file.txt | egrep -v "^>|^bye" > output.json
Ensuite, vous aurez:
{ "this" : "is a test" }
{ "this" : "is another test" }
Si vous appelez le shell avec des arguments de fichier de script, d'adresse de base de données et --quiet, vous pouvez rediriger la sortie (réalisée 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
permet de déterminer le nombre de lignes que le client Mongo est autorisé à imprimer. Sa valeur par défaut est 20.
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 depuis le terminal
La touche -z
De sed
permet de traiter la sortie comme une seule chaîne multiligne
$> mongo localhost --quiet myScriptFile.js | sed -z 's/^.*CUT_TO_HERE\n//' > output.json
Il peut vous être utile d’augmenter simplement le nombre de résultats affichés.
Dans le shell mongo>
DBQuery.shellBatchSize = 3000
et vous pouvez ensuite sélectionner tous les résultats du terminal en une fois et les coller dans un fichier texte.
C'est ce que je vais faire:)