This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# Raja Selvaraj <rajajs at gmail> | |
""" | |
Demonstrate use of pymongo to connect to a mongodb database on a hosted server, | |
specifically mongolab | |
""" | |
# Use a database already created on mongolab | |
server = 'xxxxx.mongolab.com' | |
port = xxxxx | |
db_name = 'xxxx' | |
username = 'xxxxx' | |
password = 'xxxxxx' | |
from pymongo import Connection | |
# what versions are we using | |
import sys | |
print 'Python version', sys.version | |
import pymongo | |
print 'Pymongo version', pymongo.version | |
## | |
# connect to server | |
print '\nConnecting ...' | |
conn = Connection(server, port) | |
# Get the database | |
print '\nGetting database ...' | |
db = conn[db_name] | |
# Have to authenticate to get access | |
print '\nAuthenticating ...' | |
db.authenticate(username, password) | |
# Get the documents | |
posts = db.posts | |
print '\nNumber of posts', posts.find().count() | |
# Remove all old posts | |
posts.remove() | |
print '\nNumber of posts after removal', posts.find().count() | |
# Let us add one post | |
post = {'Name' : 'Human', | |
'Heart rate' : 60, | |
'Longevity' : 70, | |
'tags' : ['domestic', 'omnivore']} | |
posts.insert(post) | |
print '\nNumber of posts after first insert', posts.find().count() | |
# Bulk inserts | |
new_posts = [{'Name': 'Cat', | |
'Heart rate' : 150, | |
'Longevity' : 15, | |
'tags' : ['domestic', 'carnivore']}, | |
{'Name' : 'Small dog', | |
'Heart rate' : 100, | |
'Longevity' : 10, | |
'tags' : ['domestic', 'omnivore']}, | |
{'Name' : 'Medium Dog', | |
'Heart rate' : 90, | |
'Longevity' : 15, | |
'tags' : ['domestic', 'omnivore']}, | |
{'Name' : 'Large dog', | |
'Heart rate' : 75, | |
'Longevity' : 17, | |
'tags' : ['domestic', 'omnivore']}, | |
{'Name' : 'Chicken', | |
'Heart rate' : 275, | |
'Longevity' : 15, | |
'tags' : ['domestic', 'omnivore']}, | |
{'Name' : 'Elephant', | |
'Heart rate' : 30, | |
'Longevity' : 70, | |
'tags' : ['wild', 'herbivore']}, | |
{'Name' : 'Giraffe', | |
'Heart rate' : 65, | |
'Longevity' : 20, | |
'tags' : ['wild', 'herbivore']}] | |
posts.insert(new_posts) | |
print '\nNumber of posts after bulk insert', posts.find().count() | |
## Querying | |
# Let us see all the posts | |
print '\nAll posts' | |
for post in posts.find(): | |
print post | |
# find_one | |
print '\nOne post only' | |
print posts.find_one() | |
# Find animals with heart rate > 100 | |
print '\nAnimals with heart rate more than 100' | |
for post in posts.find({'Heart rate' : {"$gt" : 100}}): | |
print post | |
# Find animals with longevity between 20 and 70 (inclusive) | |
print '\nAnimals with longevity between 20 and 70 (inclusive range)' | |
for post in posts.find({'Longevity' : {"$gte" : 20, "$lte" : 100}}): | |
print post | |
# create an index to speed up queries | |
# using ensure_index instead would create an index only if it does not exist | |
print '\nCreating index for heart rate' | |
posts.create_index("Heart rate") | |
# Find by name - string matching | |
print '\nRetrieve entry for elephant' | |
print posts.find_one({'Name' : 'Elephant'}) | |
# Regex matching to find substring | |
print '\nRetrieve entries for all dogs' | |
for post in posts.find({'Name' : {'$regex' : 'dog'}}): | |
print post | |
# Do same with more regex options | |
print '\nRetrieve entries for all dogs by using case insensitive matching' | |
import re | |
regex = re.compile('dog', re.IGNORECASE) | |
for post in posts.find({'Name' : regex}): | |
print post | |
# Query for tags | |
print '\nRetrieve entries for all domestic omnivores' | |
for post in posts.find({'tags' : {'$all' : ['domestic', 'omnivore']}}): | |
print post | |
# close the connection | |
print '\nClosing the connection' | |
conn.disconnect() | |
## References | |
## | |
# 1. http://api.mongodb.org/python/current/tutorial.html | |
# 2. http://www.mongodb.org/display/DOCS/Advanced+Queries | |
# 2. http://stackoverflow.com/questions/3483318/performing-regex-queries-with-pymongo | |
# 3. Data for posts - http://www.sjsu.edu/faculty/watkins/longevity.htm |