Search code examples
mongodbiomongodb-querymongo-shell

Printing Mongo query output to a file while in the mongo shell


2 days old with Mongo and I have a SQL background so bear with me. As with mysql, it is very convenient to be in the MySQL command line and output the results of a query to a file on the machine. I am trying to understand how I can do the same with Mongo, while being in the shell

I can easily get the output of a query I want by being outside of the shell and executing the following command:

mongo localhost:27017/dbname --eval "printjson(db.collectionName.findOne())" > sample.json

The above way is fine, but it requires me to exit the mongo shell or open a new terminal tab to execute this command. It would be very convenient if I could simply do this while still being inside the shell.

P.S: the Question is an offshoot of a question I posted on SO


Solution

  • AFAIK, there is no a interactive option for output to file, there is a previous SO question related with this: Printing mongodb shell output to File

    However, you can log all the shell session if you invoked the shell with tee command:

    $ 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
    

    Then you'll get a file with this content:

    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
    

    To remove all the commands and keep only the json output, you can use a command similar to:

    tail -n +3 file.txt | egrep -v "^>|^bye" > output.json
    

    Then you'll get:

    { "this" : "is a test" }
    { "this" : "is another test" }