File write operations in mongo script?

Mongodb

Mongodb Problem Overview


Is this possible to write the query result to the file from mongo js script. I have searched a lot, but I didn't find any solution.

ex:-

cursor = db.users.find();

while(cursor.hasNext()) {
  cursor.next();
  // writing the cursor output to file ????<br/>
}

Mongodb Solutions


Solution 1 - Mongodb

You could use print and then redirect output:

script.js:

cursor = db.users.find();
while(cursor.hasNext()){
    printjson(cursor.next());
}

then run the script and redirect output to a file:

mongo --quiet script.js > result.txt

Solution 2 - Mongodb

http://www.mongodb.org/display/DOCS/Scripting+the+shell paragraph "Differences between scripted and interactive/ Printing".

./mongo server.com/mydb --quiet --eval "db.users.find().forEach(printjson);" > 1.txt

Solution 3 - Mongodb

Whenever I need to write the result of a mongo query to a local file I generally use the the writeFile(pathToFile, stringContents) function.

Example: let's say that you quickly need to find the email of all registered users and send it to your buddy Jim in the marketing department.

$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password 
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.json", tojson(emails))

or if Jim expect's a CSV file then

$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password 
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.csv", emails.join("\n"))

You can now send Jim the list of emails and save the day!

To important things to notice about the writeFile function:

  1. The second argument must be a string.
  2. The first argument must be a file that doesn't already exist, otherwise you will get an error.

Solution 4 - Mongodb

You can skip the while loop using forEach():

db.users.find().forEach(printjson);

Solution 5 - Mongodb

Wouldn't it be simpler to use one of the Mongo drivers for a general purpose language (such as Python, Ruby, Java, etc) and write your results to a file that way, in a format you can use (such as CSV, etc.)?

UPDATE: According to the documentation for mongodump you can export a collection with a query:

$ ./mongodump --db blog --collection posts
-q '{"created_at" : { "$gte" : {"$date" : 1293868800000},
                      "$lt"  : {"$date" : 1296460800000}
                    }
    }'

However you would need to import that collection back into MongoDB to operate on it or use mongoexport to export as JSON or CSV using the same query flag (-q) as mongodump.

Solution 6 - Mongodb

For distinct you have to create script.js file with contents:

mongo = new Mongo("localhost");
doctor = mongo.getDB("doctor");
users = doctor.getCollection("users");
cities = users.distinct("address.city");
printjson(cities);

then in console run:

mongo --quiet script.js > result.txt

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsudeshView Question on Stackoverflow
Solution 1 - MongodbmilanView Answer on Stackoverflow
Solution 2 - MongodbRoman IvanovView Answer on Stackoverflow
Solution 3 - MongodbfernandohurView Answer on Stackoverflow
Solution 4 - MongodbOubenal MohcineView Answer on Stackoverflow
Solution 5 - MongodbDarren NewtonView Answer on Stackoverflow
Solution 6 - Mongodb1nstinctView Answer on Stackoverflow