##MONGODB & PYTHON ###Ubuntu Install ``` sudo apt-get install mongodb pip install pymongo ``` Table - Collection Column - Property Row - Document Node - Single Instance of the MongoDB daemon process ###Connecting to MongoDB ``` """ An example of how to connect to MongoDB """ import sys from pymongo import Connection from pymongo.errors import ConnectionFailure def main(): """ Connect to MongoDB """ try: c = Connection(host="localhost", port=27017) print "Connected successfully" print c except ConnectionFailure, e: sys.stderr.write("Could not connect to MongoDB: %s" % e) sys.exit(1) if __name__ == "__main__": main() ``` ###Getting a Database Handle ``` """ An example of how to get a Python handle to a MongoDB database """ import sys from pymongo import Connection from pymongo.errors import ConnectionFailure def main(): """ Connect to MongoDB """ try: c = Connection(host="localhost", port=27017) except ConnectionFailure, e: sys.stderr.write("Could not connect to MongoDB: %s" % e) sys.exit(1) # Get a Database handle to a database named "mydb" dbh = c["mydb"] # Demonstrate the db.connection property to retrieve a reference to the # Connection object should it go out of scope. In most cases, keeping a # reference to the Database object for the lifetime of your program should # be sufficient. assert dbh.connection == c print "Successfully set up a database handle" if __name__ == "__main__": main() ``` ###Insert a Document Into a Collection ``` """ An example of how to insert a document """ import sys from datetime import datetime from pymongo import Connection from pymongo.errors import ConnectionFailure def main(): try: c = Connection(host="localhost", port=27017) except ConnectionFailure, e: sys.stderr.write("Could not connect to MongoDB: %s" % e) sys.exit(1) dbh = c["mydb"] assert dbh.connection == c user_doc = { "username" : "janedoe", "firstname" : "Jane", "surname" : "Doe", "dateofbirth" : datetime(1974, 4, 12), "email" : "janedoe74@example.com", "score" : 0 } dbh.users.insert(user_doc, safe=True) print "Successfully inserted document: %s" % user_doc if __name__ == "__main__": main() ``` safe=True ensures that your write will succeed or an exception will be thrown dbh.users.insert(user_doc, safe=True) w=2 means the write will not succeed until it has been written to at least 2 servers in a replica set. dbh.users.insert(user_doc, w=2) ###Query Language #####Retrieve single document ``` user_doc = dbh.users.find_one({"username" : "janedoe"}) print user_doc if not user_doc: print "no document found for username janedoe" ``` #####Retrieve all documents ``` users = dbh.users.find({"username" : "janedoe"}) if not users: print "no document found for username janedoe" else: for user in users: print user.get("email") ``` #####Retrieve a subset of properties from each document ``` users = dbh.users.find({"firstname":"jane"}, {"email":1}) for user in users: print user.get("email") ``` #####Count ``` userscount = dbh.users.find().count() print "There are %d documents in users collection" % userscount /*--or--*/ db.users.count({'name.first':'John'}); ``` #####Sort ``` import pymongo ### users = dbh.users.find().sort("dateofbirth", pymongo.DESCENDING) for user in users: print user.get("email") ``` #####Limit ``` users = dbh.users.find().sort("score", pymongo.DESCENDING).limit(10) for user in users: print user.get("username"), user.get("score", 0) ``` #####Skip ``` users = dbh.users.find().sort("username",pymongo.DESCENDING).limit(2).skip(1) for user in users: print user.get("username") ``` #####Get rid of duplicates ``` for user in dbh.users.find(snapshot=True): ``` ###Updating Documents ``` import copy # first query to get a copy of the current document old_user_doc = dbh.users.find_one({"username":"janedoe"}) new_user_doc = copy.deepcopy(old_user_doc) # modify the copy to change the email address new_user_doc["email"] = "janedoe74@example3.com" # run the update query # replace the matched document with the contents of new_user_doc dbh.users.update({"username":"janedoe"}, new_user_doc, safe=True) ``` #####Update Modifiers ``` dbh.users.update({"username":"janedoe"}, {"$set":{"email":"janedoe74@example2.com"}}, safe=True) # For multiple properties dbh.users.update({"username":"janedoe"}, {"$set":{"email":"janedoe74@example2.com", "score":1}}, safe=True) ``` In order to have your update query write multiple documents, you must pass the “multi=True” parameter to the update method. ``` dbh.users.update({"score":0},{"$set":{"flagged":True}}, multi=True, safe=True) ``` ###Deleting Documents ``` dbh.users.remove({"score":1}, safe=True) # Delete all documents in user collection dbh.users.remove(None, safe=True) ``` ###Common operations on sub-documents embedded in a list #####$pull ``` # Atomically remove an email address from a user document race-free using the # $pull update modifier user_doc = { "username":"foouser", "emails":[ { "email":"foouser1@example.com", "primary":True },{ "email":"foouser2@example2.com", "primary":False },{ "email":"foouser3@example3.com", "primary":False } ] } # Insert the user document dbh.users.insert(user_doc, safe=True) # Use $pull to atomically remove the "foouser2@example2.com" email sub-document dbh.users.update({"username":"foouser"}, {"$pull":{"emails":{"email":"foouser2@example2.com"}}}, safe=True) ``` #####$ne ``` # Use $pull to atomically remove all email sub-documents with primary not equal to True dbh.users.update({"username":"foouser"}, {"$pull":{"emails":{"primary":{"$ne":True}}}, safe=True) ``` #####$push ``` # Use $push to atomically append a new email sub-document to the user document new_email = {"email":"fooemail4@exmaple4.com", "primary":False} dbh.users.update({"username":"foouser"}, {"$push":{"emails":new_email}}, safe=True) ``` #####Positional operator ``` # Demonstrate usage of the positional operator ($) to modify # matched sub-documents in-place. user_doc = { "username":"foouser", "emails":[ { "email":"foouser1@example.com", "primary":True },{ "email":"foouser2@example2.com", "primary":False },{ "email":"foouser3@example3.com", "primary":False } ] } # Insert the user document dbh.users.insert(user_doc, safe=True) # Now make the "foouser2@example2.com" email address primrary dbh.users.update({"emails.email":"foouser2@example2.com"}, {"$set":{"emails.$.primary":True}}, safe=True) # Now make the "foouser1@example.com" email address not primary dbh.users.update({"emails.email":"foouser1@example.com"}, {"$set":{"emails.$.primary":False}}, safe=True) ``` ###MONGO EXPORT ``` mongoexport -d mydb -c users --out mydb.json ``` ###BINARY BACKUP ``` mongodump ### mongorestore -d mydb ./dump/mydb ###Convert to JSON bsondump dump/mydb/users.bson > users.json ``` ###MONGOSTAT ``` mongostat ``` ##MONGO COMMANDS (JAVASCRIPT) ``` ###SHOW AVAILABLE DATABASES show dbs ###CONNECT TO A DATABASE OR CREATE use databasename db = databasename ###TO SHOW A COLLECTION db.collectionName ###COUNT ELEMENTS ON A COLLECTION db.collectionName.count() ###STORE DOCUMENTS ON A COLLECTION db.collectionName.insert({title:"Document Title", url:"http://...", tags:["kapow","PWOF"], saved_on:new Date()}); #OR var doc = {}; doc.title = "NEW DOC TITLE"; doc.url = "http://..."; doc.tags =["KIAP","KABOOM"]; doc.saved_on = new Date(); doc.meta = {}; doc.meta.browser ="Chrome"; doc.meta.OS = "Mac OS"; db.links.save(doc); <----###if it already exists update(doc) else insert(doc) ###QUERYING db.links.find(); ###PRINT DOCUMENTS FORMATED db.links.find().forEach(printjson); ``` ###_id ObjectID( ) ``` db.users.find()[1]._id.getTimestamp() ### SET NEW ID function counter(name) { var ret = db.counters.findAndModify({query:{_id:name}, update:{$inc : {next:1}}, "new":true, upsert:true); return ret.next; } db.products.insert({_id: counter("products"), name: "product 1"}); db.products.insert({_id: counter("products"), name: "product 2"}); ``` ###Relations ``` db.users.insert({ name: "Andrew"}); var a = db.users.findOne({name:"Andrew"}); db.links.insert({title:"JEWTUBE",url:"http://www.youtube.com", userId: a._id}); ``` ###Query Syntax & Operators #####SELECT ``` db.users.drop(); db.users.find(); <== returns cursorObject db.users.findOne({'firstname':'John'}); <==returns a single Document db.users.findOne({'name':'John'}).name; ``` #####LIMIT ``` db.links.find({favourites:100},{ title: 1, url: true}); <== select fields to retrieve db.links.find({favourites:100},{ title: 0, url: false}); <== exclude fields db.links.find({favourites:100},{title:1,url:1, _id:0}); ``` #####NESTING ``` db.users.find({'name.first':'John'}); db.users.findOne({'name.first':'John'},{'name.last':1}); ``` #####GREATER THAN Operator ``` db.links.find({favourites:{$gt:50}}); ``` #####LESS THAN Operator ``` db.links.find({favourites:{$lt:50}}); ``` #####LESS THAN OR EQUAL TO Operator ``` db.links.find({favourites:{$lte:50}}); ``` #####GREATER THAN OR EQUAL TO Operator ``` db.links.find({favourites:{$gte:50}}); ``` OPERATORS WORKING SIMULTANEUSLY ``` db.links.find({favourites:{$gt:50, $lt:300}}); ``` #####NOT EQUAL Operator ``` db.links.find({'name':{$ne:'John'}}); ``` #####OR Operator ``` db.links.find({$or: [{'name.first':'John'},{'name.last':'Wilson'}]}); ``` #####NOR (NOT OR) Operator ``` db.links.find({$nor: [{'name.first':'John'},{'name.last':'Wilson'}]}); ``` #####AND Operator ``` db.users.find({ $and:[{'name.first':'John'},{'name.last':'Jones'}]}); ``` #####EXISTS Operator ``` db.users.find({email: {$exists:true}}); ``` #####MOD Operator ``` db.links.find({favourites: {$mod:[5,0]}}); ``` #####NOT Operator ``` db.links.find({favourites: {$not: { $mod: [5,0] }}}); ``` #####ELEMENT MATCH OPERATOR Searches inside Arrays ``` db.users.find({logins:{ $elemMatch: {minutes:20 }}}); ``` #####WHERE Operator ``` db.users.find({$where: 'this.name.first === "John"',age:30}); ``` #####MERGE DUPLICATES ``` db.link.distinct('favourites'); ``` #####GROUP Documents ``` db.links.group({ key: { userID:true }, initial: { favCount: 0 }, reduce: function (doc, o){ o.favCount += doc.favourites; }, finalize: function (o){ o.name = db.users.findOne({_id: o.userId}).name; } }); ``` #####REGEX INSIDE QUERIES ``` db.links.find({title: /tuts\+$/}); ``` #####REGEX Operator Allows you to group with other operators ``` db.links.find({ title:{ $regex: /tuts\+$/, $ne:'Mobiletuts'} }); ``` #####Sort ``` db.links.find({title:1,_id:0}).sort({title: 1}); /*ASCENDING ORDER*/ db.links.find({title:1,_id:0}).sort({title: -1}); /*DESCENDING ORDER*/ db.links.find({},{title:1,favourites: 1, _id:0}).sort({favourites:-1, title:1}); ``` #####Limit ``` db.links.find({},title:1,favourites:1,_id:0).sort({favourites:1}).limit(1); ``` #####Skip ``` db.links.find().skip(0*3).limit(3); /*GETS ELEMENTS 1,2 & 3*/ db.links.find().skip(1*3).limit(3); /*GETS ELEMENTS 4,5 & 6*/ ``` ###Updating Documents ####Update Method #####Update By Replacement Replace whatever record it finds that matches the first object. All other fields are removed and replaced with the second object values. ``` db.users.update({'name.first':'John'},{'job':'developer'}); /*UPSERT*/ /*Use this if you want to create a document if it doesn't find the one you passed to update*/ db.users.update({name: 'Kate Wills'},{name: 'Kate Wills', job:'LISP Developer}, true); ``` #####Update By Modification ``` /*INCREMENT*/ var n = {title: 'Nettuts+'}; db.links.find(n,{title:1, favourites:1}); db.links.update(n,{$inc:{favourites: 5}); db.links.update(n,{$inc:{favourites: -5}); /*CHANGE VALUE*/ var q = {name: "Kate Wills}; db.users.update(q,{$set: {job: 'Wev Developer'}}); /*This also works with fields that doesn't exist yet, and to get rid of fields*/ db.users.update(q,{$unset: {job: 'Wev Developer'}}); ``` #####Update Multiple Records This just works with updates by modification. ``` sadf ```