web-dev-qa-db-fra.com

Impression de la sortie de requête Mongo dans un fichier dans le shell mongo

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

43
Parijat Kalia

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" }
52
Roberto

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 
18
Rondo

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.

17
Jyotman Singh

Combinant plusieurs conditions:

  • écrire une requête mongo dans un fichier JS et l'envoyer depuis le terminal
  • basculer/définir une base de données par programme
  • afficher tous les enregistrements trouvés
  • couper les lignes de sortie initiales
  • enregistrer la sortie dans un 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 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

3
SergO

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:)

(from: https://stackoverflow.com/a/3705615/1290746 )

3
kris