Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Thomas Rückstieß - Building your first app; an ...

Thomas Rückstieß - Building your first app; an Introduction to MongoDB

This talk will introduce the philosophy and features of the open source, NoSQL database MongoDB. We’ll discuss the benefits of the document-based data model that MongoDB offers by walking through how one can build a simple app to store books. We’ll cover inserting, updating, and querying the database of books. The second part of the talk will then dive a little deeper into advanced topics, like schema design, query optimization and indexing.

Munich DataGeeks

October 08, 2013
Tweet

More Decks by Munich DataGeeks

Other Decks in Technology

Transcript

  1. MongoDB is a ___________ database •  Document •  Open source

    •  High performance •  Horizontally scalable •  Full featured
  2. Document Database •  Not for .PDF & .DOC files • 

    A document is essentially an associative array with key/value pairs (possibly nested) { username : “thomas.r", num_logins : 39, last_login : ISODate("2013-10-08T16:46:21Z"), permissions : ["read", "write", "list", "admin"], company : { name : "MongoDB, Inc." location : "Sydney, Australia" } }
  3. Open Source •  MongoDB is an open source project • 

    On GitHub •  Licensed under the AGPL •  Started & sponsored by 10gen (now MongoDB, Inc.) •  Commercial licenses available •  Contributions welcome
  4. High Performance •  Written in C++ •  Data serialized as

    BSON (fast parsing) •  Extensive use of memory-mapped files i.e. read-through write-through memory caching. •  Full support for primary & secondary indexes •  Document model = less work
  5. Full Featured •  Ad Hoc queries •  Real time aggregation

    •  Rich query capabilities •  Strongly consistent •  Geospatial features •  Support for most programming languages •  Flexible schema
  6. $ mongo MongoDB shell version: 2.4.4 connecting to: test >

    db.test.insert( { text: 'Welcome to MongoDB’ } ) > db.test.find().pretty() { "_id" : ObjectId("51c34130fbd5d7261b4cdb55"), "text" : "Welcome to MongoDB" } Mongo Shell
  7. Terminology RDBMS MongoDB Table, View ➜ Collection Row ➜ Document

    Index ➜ Index Join ➜ Embedded Document Foreign Key ➜ Reference Partition ➜ Shard
  8. Entities in our Blogging System •  Users •  Articles • 

    Comments •  Tags •  Categories ( ? )
  9. Typical (relational) ERD User ·Name ·Email address Category ·Name ·URL

    Comment ·Comment ·Date ·Author Article ·Name ·Slug ·Publish date ·Text Tag ·Name ·URL
  10. Relational schema design •  Large ERD Diagrams •  Complex “create

    table” statements •  ORMs to map tables to objects •  Tables just to join tables together •  Lots of revisions until we get it right
  11. MongoDB ERD User ·Name ·Email address Article ·Name ·Slug ·Publish

    date ·Text ·Author Comment[] ·Comment ·Date ·Author Tag[] ·Value Category[] ·Value
  12. > var user = { username: ’thomas.r', first_name: ’Thomas', last_name:

    ’Rückstieß', } Start with an object (or array, hash, dict, etc)
  13. > db test > use blog switched to db blog

    // syntax is “db.<collection>.<command>” > db.users.insert( user ) Insert the Record No db/collection creation necessary
  14. // get one document (don’t care which one) > db.users.findOne()

    { "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : ”thomas.r", "first_name" : ”Thomas", "last_name" : ”Rückstieß" } Retrieve the Record again
  15. _id •  _id is the primary key in MongoDB • 

    Automatically created as an ObjectId if not provided •  Automatically indexed •  Any unique immutable value could be used
  16. ObjectId •  ObjectId is a special 12 byte value • 

    Guaranteed to be unique across your cluster •  ObjectId("50804d0bd94ccab2da652599") ts mac pid inc
  17. > db.articles.insert( { title: ‘Hello World’, body: ‘This is my

    first blog post’, date: new Date(‘2013-06-20’), username: ‘thomas.r’, tags: [‘adventure’, ‘mongodb’], comments: [ ] } ) Creating a Blog Article
  18. > db.articles.find().pretty() { "_id" : ObjectId("51c3bafafbd5d7261b4cdb5a"), "title" : "Hello World",

    "body" : "This is my first blog post", "date" : ISODate("2013-06-20T00:00:00Z"), "username" : ”thomas.r", "tags" : [ "adventure", "mongodb" ], "comments" : [ ] } Finding the Article
  19. > db.articles.find( { _id : ObjectId("51c3bafafbd5d7261b4cdb5a") } ) .pretty() {

    "_id" : ObjectId("51c3bafafbd5d7261b4cdb5a"), "title" : "Hello World", "body" : "This is my first blog post", "date" : ISODate("2013-06-20T00:00:00Z"), "username" : ”thomas.r", "tags" : [ "adventure", "mongodb" ], "comments" : [ ] } Finding the Article
  20. > db.articles.find( { tags : 'adventure’ } ).pretty() { "_id"

    : ObjectId("51c3bcddfbd5d7261b4cdb5b"), "title" : "Hello World", "body" : "This is my first blog post", "date" : ISODate("2013-06-20T00:00:00Z"), "username" : ”thomas.r", "tags" : [ "adventure", "mongodb" ], "comments" : [ ] } Querying An Array
  21. // the syntax is: “ update ( what, how )

    “ > db.articles.update( { _id: ObjectId("51c3bcddfbd5d7261b4cdb5b”) }, { "$push" : { "comments" : { "name" : "Steve Noname", "comment" : "Awesome Post" } } ) Using Update to Add a Comment
  22. > db.articles.find( { username: “thomas.r” } ).pretty() { "_id" :

    ObjectId("51c3bcddfbd5d7261b4cdb5b"), "body" : "This is my first blog post", "comments" : [ { "name" : "Steve Noname", "comment" : "Awesome Post" } ], "date" : ISODate("2013-06-20T00:00:00Z"), "tags" : [ "adventure", "mongodb" ], "title" : "Hello World", "username" : ”thomas.r" } Article with Comment Embedded
  23. // remove comment with $pull > var last_comment = {

    "name" : "Steve Noname", "comment" : "Awesome Post” } > db.articles.update( { _id: ObjectId("51c3bcddfbd5d7261b4cdb5b") }, { $pull : { comments: last_comment } } ) // remove article > db.articles.remove( { _id: ObjectId("51c3bcddfbd5d7261b4cdb5b") } ) Remove Comments / Articles
  24. MongoDB Drivers •  Official Support for 12 languages •  Community

    drivers for tons more •  Drivers connect to mongo servers •  Drivers translate BSON into native types •  mongo shell is not a driver, but works like one in some ways •  Installed using typical means (npm, pecl, gem, pip)
  25. Indexes in MongoDB 7 16 1 2 5 6 9

    12 18 21 B-Trees 13 {x: 13} Queries, inserts and deletes: O( log n ) time
  26. // create index with ensureIndex, client caches the // index

    build > db.articles.ensureIndex({ username: 1 }) > db.articles.ensureIndex({ date: –1 }) > db.articles.getIndexes() How Do I Create Indexes? [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.articles", "name" : "_id_" }, { "v" : 1, "key" : { "username" : 1 }, "ns" : "test.articles", "name" : "username_1" }, { "v" : 1, "key" : { "date" : -1 }, "ns" : "test.articles", "name" : "date_-1" } ]
  27. // Multiple fields (compound key indexes) > db.authors.ensureIndex({ first_name: 1,

    last_name: 1 }) // Arrays of values (multikey indexes) > var article = { title : "Hello World", body : "This is my first blog post", ... tags: [’adventure', ’mongodb'] } > db.recipes.ensureIndex({ tags: 1 }) What Can Be Indexed?
  28. // Sub-documents > var category = { name: ‘Technical Posts',

    maintainer: { username: ‘joe.example’, email_address: ’[email protected]’ } } db.categories.ensureIndex({ ’maintainer.username': 1 }) db.recipes.ensureIndex({ ’maintainer': 1 }) What Can Be Indexed?
  29. Index Options •  Uniqueness constraints (unique, dropDups) •  Sparse Indexes

    •  Geospatial Indexes •  TTL Collections (expireAfterSeconds)
  30. Profiling Slow Operations •  db.setProfilingLevel( n , slowms=100ms ) • 

    n=0 profiler off •  n=1 record operations longer than slowms •  n=2 record all queries •  db.system.profile.find( ) image: http://www.speareducation.com/
  31. > db.articles.find( { tags: ‘mongodb’ } ) .explain( ) {

    "cursor" : "BasicCursor" , "n" : 42, "nscannedObjects” : 13204, "nscanned" : 13204, ... "millis" : 356, ... } The Explain Plan (without Index)
  32. > db.articles.find( { tags: ‘mongodb’ } ) .explain( ) {

    "cursor" : "BtreeCursor tags_1”, ”isMultiKey" : true, "n" : 42, "nscannedObjects": 42 "nscanned" : 42, ”scanAndOrder" : false, "millis" : 0, ... } The Explain Plan (with Index)
  33. [email protected] @tomonezero Thomas Rückstieß #MongoDBDays Questions ? MongoDB Munich October

    14, Hilton Munich City www.mongodb.com/events/ mongodb-munich-2013