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

28
demandé sur Community 2014-03-21 21:12:49

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" }
37
répondu Roberto 2017-05-23 11:55:11

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 
11
répondu Rondo 2014-12-23 02:04:09

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.

5
répondu Jyotman Singh 2018-04-04 14:55:56

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

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

1
répondu kris 2017-06-02 02:31:15

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

0
répondu SergO 2018-03-19 12:41:53