Skip to content

Instantly share code, notes, and snippets.

@catherinedevlin
Created November 14, 2013 05:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save catherinedevlin/7461964 to your computer and use it in GitHub Desktop.
Save catherinedevlin/7461964 to your computer and use it in GitHub Desktop.
From Dayton Dynamic Languages Nov 13 meeting on MongodDB
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"MongoDB"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Like an RDBMS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- uses a client and a server\n",
"- cross-language access"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo\n",
"show dbs"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: test\n",
"bronto\t7.9501953125GB\n",
"five\t0.203125GB\n",
"google_analytics\t19.9443359375GB\n",
"local\t0.078125GB\n",
"netsuite\t3.9521484375GB\n",
"small\t0.203125GB\n",
"test\t0.203125GB\n",
"v\t0.203125GB\n",
"bye\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.dropDatabase()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"dropped\" : \"dayton\", \"ok\" : 1 }\n",
"bye\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Different jargon"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Database -> database\n",
"- Table (or relation) -> collection\n",
"- Row (or tuple) -> document"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Schemaless: Mentioning it is creating it"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Handy and terrifying"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo\n",
"use dayton;\n",
"db.members.insert({'name': 'Ken', 'language': 'Perl'})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: test\n",
"switched to db dayton\n",
"bye\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo\n",
"show dbs;\n",
"use dayton;\n",
"show collections;"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: test\n",
"bronto\t7.9501953125GB\n",
"dayton\t0.203125GB\n",
"five\t0.203125GB\n",
"google_analytics\t19.9443359375GB\n",
"local\t0.078125GB\n",
"netsuite\t3.9521484375GB\n",
"small\t0.203125GB\n",
"test\t0.203125GB\n",
"v\t0.203125GB\n",
"switched to db dayton\n",
"members\n",
"system.indexes\n",
"bye\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo\n",
"use dayton;\n",
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: test\n",
"switched to db dayton\n",
"{ \"_id\" : ObjectId(\"528418c9b8fa004981577216\"), \"name\" : \"Ken\", \"language\" : \"Perl\" }\n",
"bye\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Structure in documents"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.insert({name: \"Grant\", language: [\"PHP\", \"Perl\"]})\n",
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"528418c9b8fa004981577216\"), \"name\" : \"Ken\", \"language\" : \"Perl\" }\n",
"{ \"_id\" : ObjectId(\"52841a211de978769fc0ce4c\"), \"name\" : \"Grant\", \"language\" : [ \"PHP\", \"Perl\" ] }\n",
"bye\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"bob = {name: \"Bob\", language: \"Python\", \n",
" spouse: {\"name\": \"\"},\n",
" pets: [{\"name\": \"Fido\", \"species\": \"dog\"}, \n",
" {\"name\": \"Sonic\", \"species\": \"hedgehog\"}]\n",
" };\n",
"db.members.insert(bob)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{\n",
"\t\"name\" : \"Bob\",\n",
"\t\"language\" : \"Python\",\n",
"\t\"spouse\" : {\n",
"\t\t\"name\" : \"\"\n",
"\t},\n",
"\t\"pets\" : [\n",
"\t\t{\n",
"\t\t\t\"name\" : \"Fido\",\n",
"\t\t\t\"species\" : \"dog\"\n",
"\t\t},\n",
"\t\t{\n",
"\t\t\t\"name\" : \"Sonic\",\n",
"\t\t\t\"species\" : \"hedgehog\"\n",
"\t\t}\n",
"\t]\n",
"}\n",
"bye\n"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"528418c9b8fa004981577216\"), \"name\" : \"Ken\", \"language\" : \"Perl\" }\n",
"{ \"_id\" : ObjectId(\"52841a211de978769fc0ce4c\"), \"name\" : \"Grant\", \"language\" : [ \"PHP\", \"Perl\" ] }\n",
"{ \"_id\" : ObjectId(\"52841a91b57f8e18a0ac79a7\"), \"name\" : \"Bob\", \"language\" : \"Python\", \"spouse\" : { \"name\" : \"\" }, \"pets\" : [ \t{ \t\"name\" : \"Fido\", \t\"species\" : \"dog\" }, \t{ \t\"name\" : \"Sonic\", \t\"species\" : \"hedgehog\" } ] }\n",
"bye\n"
]
}
],
"prompt_number": 12
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"finding"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.find({pets: [ \t{ \t\"name\" : \"Fido\", \t\"species\" : \"dog\" }, \t{ \t\"name\" : \"Sonic\", \t\"species\" : \"hedgehog\" } ]});"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"52841a91b57f8e18a0ac79a7\"), \"name\" : \"Bob\", \"language\" : \"Python\", \"spouse\" : { \"name\" : \"\" }, \"pets\" : [ \t{ \t\"name\" : \"Fido\", \t\"species\" : \"dog\" }, \t{ \t\"name\" : \"Sonic\", \t\"species\" : \"hedgehog\" } ] }\n",
"bye\n"
]
}
],
"prompt_number": 17
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"indexing"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.find({name: \"Grant\"}).explain();"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{\n",
"\t\"cursor\" : \"BasicCursor\",\n",
"\t\"isMultiKey\" : false,\n",
"\t\"n\" : 1,\n",
"\t\"nscannedObjects\" : 3,\n",
"\t\"nscanned\" : 3,\n",
"\t\"nscannedObjectsAllPlans\" : 3,\n",
"\t\"nscannedAllPlans\" : 3,\n",
"\t\"scanAndOrder\" : false,\n",
"\t\"indexOnly\" : false,\n",
"\t\"nYields\" : 0,\n",
"\t\"nChunkSkips\" : 0,\n",
"\t\"millis\" : 0,\n",
"\t\"indexBounds\" : {\n",
"\t\t\n",
"\t},\n",
"\t\"server\" : \"elli:27017\"\n",
"}\n",
"bye\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.ensureIndex({pets: 1});\n",
"db.members.find({name: \"Grant\"}).explain();"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{\n",
"\t\"cursor\" : \"BtreeCursor name_1\",\n",
"\t\"isMultiKey\" : false,\n",
"\t\"n\" : 1,\n",
"\t\"nscannedObjects\" : 1,\n",
"\t\"nscanned\" : 1,\n",
"\t\"nscannedObjectsAllPlans\" : 1,\n",
"\t\"nscannedAllPlans\" : 1,\n",
"\t\"scanAndOrder\" : false,\n",
"\t\"indexOnly\" : false,\n",
"\t\"nYields\" : 0,\n",
"\t\"nChunkSkips\" : 0,\n",
"\t\"millis\" : 0,\n",
"\t\"indexBounds\" : {\n",
"\t\t\"name\" : [\n",
"\t\t\t[\n",
"\t\t\t\t\"Grant\",\n",
"\t\t\t\t\"Grant\"\n",
"\t\t\t]\n",
"\t\t]\n",
"\t},\n",
"\t\"server\" : \"elli:27017\"\n",
"}\n",
"bye\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"updating"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"danger!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.find({name: \"Bob\"})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"52841a91b57f8e18a0ac79a7\"), \"name\" : \"Bob\", \"language\" : \"Python\", \"spouse\" : { \"name\" : \"\" }, \"pets\" : [ \t{ \t\"name\" : \"Fido\", \t\"species\" : \"dog\" }, \t{ \t\"name\" : \"Sonic\", \t\"species\" : \"hedgehog\" } ] }\n",
"bye\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.update({name: \"Bob\"}, {cm: 180});"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"bye\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.find();"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"528418c9b8fa004981577216\"), \"name\" : \"Ken\", \"language\" : \"Perl\" }\n",
"{ \"_id\" : ObjectId(\"52841a211de978769fc0ce4c\"), \"name\" : \"Grant\", \"language\" : [ \"PHP\", \"Perl\" ] }\n",
"{ \"_id\" : ObjectId(\"52841a91b57f8e18a0ac79a7\"), \"cm\" : 180 }\n",
"bye\n"
]
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that, by default, only one document is updated. Fourth arg = true enables multi-update."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.update({name: \"Grant\"}, {$set: {cm: 180}}, true, true);"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"bye\n"
]
}
],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"528418c9b8fa004981577216\"), \"name\" : \"Ken\", \"language\" : \"Perl\" }\n",
"{ \"_id\" : ObjectId(\"52841a91b57f8e18a0ac79a7\"), \"cm\" : 180 }\n",
"{ \"_id\" : ObjectId(\"52841a211de978769fc0ce4c\"), \"cm\" : 180, \"language\" : [ \"PHP\", \"Perl\" ], \"name\" : \"Grant\" }\n",
"bye\n"
]
}
],
"prompt_number": 32
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"need the `$set` modifier"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.update({name: \"Ken\"}, {$set: {cm: 185}});\n",
"db.members.find({name: \"Ken\"});"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.remove({name: null})\n",
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"From your language"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pymongo\n",
"client = pymongo.Connection()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"db = client.dayton\n",
"db"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 34,
"text": [
"Database(Connection('localhost', 27017), u'dayton')"
]
}
],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 35,
"text": [
"<pymongo.cursor.Cursor at 0x32a2a50>"
]
}
],
"prompt_number": 35
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for member in db.members.find():\n",
" print member"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{u'_id': ObjectId('528418c9b8fa004981577216'), u'name': u'Ken', u'language': u'Perl'}\n",
"{u'_id': ObjectId('52841a91b57f8e18a0ac79a7'), u'cm': 180.0}\n",
"{u'_id': ObjectId('52841a211de978769fc0ce4c'), u'language': [u'PHP', u'Perl'], u'cm': 180.0, u'name': u'Grant'}\n"
]
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dave = {'name': 'Dave', 'language': 'Python'}\n",
"db.members.insert(dave)\n",
"list(db.members.find())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
"[{u'_id': ObjectId('528418c9b8fa004981577216'),\n",
" u'language': u'Perl',\n",
" u'name': u'Ken'},\n",
" {u'_id': ObjectId('52841a91b57f8e18a0ac79a7'), u'cm': 180.0},\n",
" {u'_id': ObjectId('52841a211de978769fc0ce4c'),\n",
" u'cm': 180.0,\n",
" u'language': [u'PHP', u'Perl'],\n",
" u'name': u'Grant'},\n",
" {u'_id': ObjectId('52842205417f34189f8d7f61'),\n",
" u'language': u'Python',\n",
" u'name': u'Dave'}]"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"no joins"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"two-query method"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.languages.insert({_id: \"Ruby\", creator: \"Matz\"});\n",
"db.languages.insert({_id: \"Python\", creator: \"Guido\"});\n",
"db.languages.insert({_id: \"Perl\", creator: \"Larry\"});\n",
"db.languages.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : \"Ruby\", \"creator\" : \"Matz\" }\n",
"{ \"_id\" : \"Python\", \"creator\" : \"Guido\" }\n",
"{ \"_id\" : \"Perl\", \"creator\" : \"Larry\" }\n",
"bye\n"
]
}
],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for member in db.members.find():\n",
" print member.get('name')\n",
" if 'language' in member:\n",
" print member['language']\n",
" lang = db.languages.find_one({'_id': member['language']})\n",
" if lang:\n",
" print lang['creator']\n",
" print"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Ken\n",
"Perl\n",
"Larry\n",
"\n",
"None\n",
"\n",
"Grant\n",
"[u'PHP', u'Perl']\n",
"\n",
"Dave\n",
"Python\n",
"Guido\n",
"\n"
]
}
],
"prompt_number": 39
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"nesting"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.members.update({language: \"Python\"}, {$set: {language: {name: \"Python\", creator: \"Guido\"}}})\n",
"db.members.update({language: \"Ruby\"}, {$set: {language: {name: \"Ruby\", creator: \"Matz\"}}})\n",
"db.members.update({language: \"Perl\"}, {$set: {language: {name: \"Perl\", creator: \"Larry\"}}})\n",
"db.members.find()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"MongoDB shell version: 2.4.6\n",
"connecting to: dayton\n",
"{ \"_id\" : ObjectId(\"52841a91b57f8e18a0ac79a7\"), \"cm\" : 180 }\n",
"{ \"_id\" : ObjectId(\"52841a211de978769fc0ce4c\"), \"cm\" : 180, \"language\" : [ \"PHP\", \"Perl\" ], \"name\" : \"Grant\" }\n",
"{ \"_id\" : ObjectId(\"52842205417f34189f8d7f61\"), \"language\" : { \"name\" : \"Python\", \"creator\" : \"Guido\" }, \"name\" : \"Dave\" }\n",
"{ \"_id\" : ObjectId(\"528418c9b8fa004981577216\"), \"language\" : { \"name\" : \"Perl\", \"creator\" : \"Larry\" }, \"name\" : \"Ken\" }\n",
"bye\n"
]
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for member in db.members.find():\n",
" if 'name' in member:\n",
" print member['name']\n",
" if 'language' in member:\n",
" if not isinstance(member['language'], list):\n",
" print member['language']['creator']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Grant\n",
"Dave\n",
"Guido\n",
"Ken\n",
"Larry\n"
]
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 16 MB record limit\n",
"- redundant storage"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%script mongo dayton\n",
"db.dropDatabase()"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment