SlideShare ist ein Scribd-Unternehmen logo
1 von 132
MongoDB + the JVM
                          Integrating NoSQL with the JVM
                                Brendan McAdams
                                     10gen, Inc.
                                  brendan@10gen.com
                                        @rit


Tuesday, October 16, 12
Let’s Face It ...

                              SQL Sucks.




Tuesday, October 16, 12
Let’s Face It ...

                                  SQL Sucks.

                          For some problems at least.




Tuesday, October 16, 12
Stuffing an object graph into a relational model is
                like fitting a square peg into a round hole.




Tuesday, October 16, 12
Stuffing an object graph into a relational model is
                like fitting a square peg into a round hole.




              Databases should simplify application development - they
               should present a model that fits naturally with our code


Tuesday, October 16, 12
MongoDB as a Database




Tuesday, October 16, 12
MongoDB as a Database



     • MongoDB is designed to fit your application




Tuesday, October 16, 12
MongoDB as a Database



     • MongoDB is designed to fit your application
              • Flexible




Tuesday, October 16, 12
MongoDB as a Database



     • MongoDB is designed to fit your application
              • Flexible
              • Fast




Tuesday, October 16, 12
MongoDB as a Database



     • MongoDB is designed to fit your application
              • Flexible
              • Fast
              • Sane




Tuesday, October 16, 12
MongoDB as a Database




Tuesday, October 16, 12
MongoDB as a Database



     • Two crucial core concepts




Tuesday, October 16, 12
MongoDB as a Database



     • Two crucial core concepts

              • Document Oriented Data




Tuesday, October 16, 12
MongoDB as a Database



     • Two crucial core concepts

              • Document Oriented Data

              • Scalability




Tuesday, October 16, 12
MongoDB as a Database




Tuesday, October 16, 12
MongoDB as a Database



     • Document Oriented Data




Tuesday, October 16, 12
MongoDB as a Database



     • Document Oriented Data
              • Instead of flat row structures, “document oriented”
              data (similar to JSON)




Tuesday, October 16, 12
MongoDB as a Database



     • Document Oriented Data
              • Instead of flat row structures, “document oriented”
              data (similar to JSON)
              • Rich: Embed other documents and arrays as values




Tuesday, October 16, 12
Rich Documents Represent MongoDB Data



       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “publisher”: “The Pragmatic Programmers, LLC”,
       }




Tuesday, October 16, 12
Rich Documents Represent MongoDB Data



       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “publisher”: “The Pragmatic Programmers, LLC”,
       }



            Like JSON , MongoDB Documents are made up of key and
                                value pairs.



Tuesday, October 16, 12
Rich Documents Represent MongoDB Data




Tuesday, October 16, 12
Rich Documents Represent MongoDB Data


       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                 "currency": "USD",
                 "discount": 24.14,
                 "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
       }
           Values can be complex, such as embedded subdocuments...




Tuesday, October 16, 12
Rich Documents Represent MongoDB Data




Tuesday, October 16, 12
Rich Documents Represent MongoDB Data
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
                                      Or even arrays!
       }




Tuesday, October 16, 12
Querying with MongoDB




Tuesday, October 16, 12
Querying with MongoDB


     • Querying in MongoDB is similar to a ‘query by example’
     interface




Tuesday, October 16, 12
Querying with MongoDB


     • Querying in MongoDB is similar to a ‘query by example’
     interface




Tuesday, October 16, 12
Querying with MongoDB


     • Querying in MongoDB is similar to a ‘query by example’
     interface

              • Finding items by exact match via “key” = “value”




Tuesday, October 16, 12
Querying with MongoDB


     • Querying in MongoDB is similar to a ‘query by example’
     interface

              • Finding items by exact match via “key” = “value”

              • Built-in Query Expressions for more advanced
              statements




Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“author”: “Joe Armstrong”})
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
       }




Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“author”: “Joe Armstrong”})
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
       }
                          Basic queries consist of “key” = “value”



Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“price.currency”: “USD”})
          {
              “title”: “Programming Erlang: Software for a Concurrent World”,
              “author”: “Joe Armstrong”,
              “publicationYear”: 2007,
              “price”: {
                    "currency": "USD",
                    "discount": 24.14,
                    "msrp": 36.95
              },
              “publisher”: “The Pragmatic Programmers, LLC”,
              “tags”: [
                 “erlang”,
                 “concurrent programming”,
                 “multicore”,
                 “programming”
              ]
       }




Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“price.currency”: “USD”})
          {
              “title”: “Programming Erlang: Software for a Concurrent World”,
              “author”: “Joe Armstrong”,
              “publicationYear”: 2007,
              “price”: {
                    "currency": "USD",
                    "discount": 24.14,
                    "msrp": 36.95
              },
              “publisher”: “The Pragmatic Programmers, LLC”,
              “tags”: [
                 “erlang”,
                 “concurrent programming”,
                 “multicore”,
                 “programming”
              ]
       }                  Embedded docs can be accessed by
                             “key.subkey” = “value”


Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“tags”: “multicore”})
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
       }




Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“tags”: “multicore”})
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
       }                   Embedded arrays can be accessed by
                          matching just a single value from the array


Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“price.discount”: {$lt: 25.00}})
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
       }




Tuesday, October 16, 12
Querying With MongoDB
        > db.books.find({“price.discount”: {$lt: 25.00}})
       {
            “title”: “Programming Erlang: Software for a Concurrent World”,
            “author”: “Joe Armstrong”,
            “publicationYear”: 2007,
            “price”: {
                  "currency": "USD",
                  "discount": 24.14,
                  "msrp": 36.95
            },
            “publisher”: “The Pragmatic Programmers, LLC”,
            “tags”: [
               “erlang”,
               “concurrent programming”,
               “multicore”,
               “programming”
            ]
       }       Finally, MongoDB provides a set of query expressions for
                     concepts such as greater than, less than, etc.


Tuesday, October 16, 12
MongoDB as a Database




Tuesday, October 16, 12
MongoDB as a Database



              • Scalability




Tuesday, October 16, 12
MongoDB as a Database



              • Scalability
                          • Database should grow and scale with our application




Tuesday, October 16, 12
MongoDB as a Database



              • Scalability
                          • Database should grow and scale with our application
                             • Replica Sets: Robust, modernized Replication Model with
                             automatic failover




Tuesday, October 16, 12
MongoDB as a Database



              • Scalability
                          • Database should grow and scale with our application
                             • Replica Sets: Robust, modernized Replication Model with
                             automatic failover
                             • Sharding: n-scalable horizontal partitioning with automatic
                             management




Tuesday, October 16, 12
MongoDB on the JVM




Tuesday, October 16, 12
MongoDB on the JVM


     • MongoDB has strong, wide support on the JVM




Tuesday, October 16, 12
MongoDB on the JVM


     • MongoDB has strong, wide support on the JVM
              • Java




Tuesday, October 16, 12
MongoDB on the JVM


     • MongoDB has strong, wide support on the JVM
              • Java
              • Scala




Tuesday, October 16, 12
MongoDB on the JVM


     • MongoDB has strong, wide support on the JVM
              • Java
              • Scala
              • Hadoop




Tuesday, October 16, 12
MongoDB on the JVM


     • MongoDB has strong, wide support on the JVM
              • Java
              • Scala
              • Hadoop
              • Also, fantastic work occurring in Clojure community
              (see Monger - http://clojuremongodb.info/ )




Tuesday, October 16, 12
MongoDB + Java




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures
                          • “Object Document Mapping” (like Hibernate, but less
                          painful)




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures
                          • “Object Document Mapping” (like Hibernate, but less
                          painful)
                             • Morphia




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures
                          • “Object Document Mapping” (like Hibernate, but less
                          painful)
                             • Morphia
                                 • Map domain objects to MongoDB with JPA-like
                                 annotations




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures
                          • “Object Document Mapping” (like Hibernate, but less
                          painful)
                             • Morphia
                                 • Map domain objects to MongoDB with JPA-like
                                 annotations
                             • Spring Data




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures
                          • “Object Document Mapping” (like Hibernate, but less
                          painful)
                             • Morphia
                                 • Map domain objects to MongoDB with JPA-like
                                 annotations
                             • Spring Data
                                 • Spring ODM for many NoSQL databases, supports
                                 MongoDB




Tuesday, October 16, 12
MongoDB + Java

              • Java + MongoDB
                          • “Core” MongoDB Driver (mongo-java-driver)
                             • Manipulate MongoDB Docs as Map-like structures
                          • “Object Document Mapping” (like Hibernate, but less
                          painful)
                             • Morphia
                                 • Map domain objects to MongoDB with JPA-like
                                 annotations
                             • Spring Data
                                 • Spring ODM for many NoSQL databases, supports
                                 MongoDB
                                 • GA Release announced today


Tuesday, October 16, 12
Core MongoDB + Java




Tuesday, October 16, 12
Core MongoDB + Java
                          The Mongo class represents a connection pool

        com.mongodb.Mongo m = new Mongo();




Tuesday, October 16, 12
Core MongoDB + Java
                          The Mongo class represents a connection pool

        com.mongodb.Mongo m = new Mongo();

                          The DB class represents a Database context

        com.mongodb.DB db = m.getDB( "bookstore" );




Tuesday, October 16, 12
Core MongoDB + Java
                            The Mongo class represents a connection pool

        com.mongodb.Mongo m = new Mongo();

                             The DB class represents a Database context

        com.mongodb.DB db = m.getDB( "bookstore" );


                          The DBCollection class represents a Collection
                                (Mongo’s version of a table) handle


        com.mongodb.DBCollection coll = db.getCollection( "books" );




Tuesday, October 16, 12
Core MongoDB + Java




Tuesday, October 16, 12
Core MongoDB + Java
                          Documents are represented by DBObject


        com.mongodb.DBObject q = new BasicDBObject();
        q.put( “tag”, “scala” );
        q.put( “price”, new BasicDBObject( “$lt”, 40.00 ) );




Tuesday, October 16, 12
Core MongoDB + Java
                            Documents are represented by DBObject


        com.mongodb.DBObject q = new BasicDBObject();
        q.put( “tag”, “scala” );
        q.put( “price”, new BasicDBObject( “$lt”, 40.00 ) );


                             Queries return a DBCursor, which is both
                          Iterator<DBObject> and Iterable<DBObject>

        for ( DBObject doc : coll.find( q ) ) {
           // ...
        }




Tuesday, October 16, 12
Core MongoDB + Java




Tuesday, October 16, 12
Core MongoDB + Java


                          There is also a QueryBuilder helper class for
                                             querying


        DBObject q = QueryBuilder.start( “price” ).lessThan( 40.00 ).
                       and( “tag” ).is( “scala” ).get();




Tuesday, October 16, 12
Core MongoDB + Java


                           There is also a QueryBuilder helper class for
                                              querying


        DBObject q = QueryBuilder.start( “price” ).lessThan( 40.00 ).
                       and( “tag” ).is( “scala” ).get();

                           If you don’t fancy doing everything by hand, you
                          can use tools like Morphia to map domain objects
                                            automatically...




Tuesday, October 16, 12
Object Mapping Java via Morphia




Tuesday, October 16, 12
Object Mapping Java via Morphia
                          Morphia uses JPA-like Annotations to mark up
                           domain objects for MongoDB persistence

        @Entity("books") // Book classes persist to / from “books”
        class Book {}




Tuesday, October 16, 12
Object Mapping Java via Morphia
                            Morphia uses JPA-like Annotations to mark up
                             domain objects for MongoDB persistence

        @Entity("books") // Book classes persist to / from “books”
        class Book {}
                          Any field can be tagged as the primary key via the
                                            @Id annotation

      @Id private ObjectId id;




Tuesday, October 16, 12
Object Mapping Java via Morphia
                            Morphia uses JPA-like Annotations to mark up
                             domain objects for MongoDB persistence

        @Entity("books") // Book classes persist to / from “books”
        class Book {}
                          Any field can be tagged as the primary key via the
                                            @Id annotation

      @Id private ObjectId id;


                               List fields are automatically persisted as
                                            MongoDB arrays

     private List<String> tags = new ArrayList<String>();




Tuesday, October 16, 12
Object Mapping Java via Morphia




Tuesday, October 16, 12
Object Mapping Java via Morphia
                          Complex sub-objects can be marked to either
                             “embed” or “reference” automatically

     /**
      * Could also use "reference", which are stored to
      * their own collection and loaded automatically
      *
      * Morphia uses the field name for where to store the value,
      */
     @Embedded private Price price;




Tuesday, October 16, 12
Object Mapping Java via Morphia
                          Complex sub-objects can be marked to either
                             “embed” or “reference” automatically

     /**
      * Could also use "reference", which are stored to
      * their own collection and loaded automatically
      *
      * Morphia uses the field name for where to store the value,
      */
     @Embedded private Price price;

                          It’s trivial to name a field one thing in MongoDB
                                   and another in our Morphia model

     /**
      * Can rename a field for how stored in MongoDB
      */
      @Property("publicationYear") private int year;



Tuesday, October 16, 12
MongoDB + Scala




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                 •Wraps the Java driver, provides strong Scala API




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                 •Wraps the Java driver, provides strong Scala API
                                 •Documents manipulated in a 2.8+ collections Map structure including
                                 Builder, Factory and CanBuildFrom




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                  •Wraps the Java driver, provides strong Scala API
                                  •Documents manipulated in a 2.8+ collections Map structure including
                                  Builder, Factory and CanBuildFrom
                          •ODMs




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                  •Wraps the Java driver, provides strong Scala API
                                  •Documents manipulated in a 2.8+ collections Map structure including
                                  Builder, Factory and CanBuildFrom
                          •ODMs
                             • Salat - Case class mapping with some optional annotations, very
                             fast and lightweight




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                  •Wraps the Java driver, provides strong Scala API
                                  •Documents manipulated in a 2.8+ collections Map structure including
                                  Builder, Factory and CanBuildFrom
                          •ODMs
                             • Salat - Case class mapping with some optional annotations, very
                             fast and lightweight
                             • Lift - Popular Scala web framework includes a MongoDB ODM
                             layer based on the ActiveRecord pattern




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                  •Wraps the Java driver, provides strong Scala API
                                  •Documents manipulated in a 2.8+ collections Map structure including
                                  Builder, Factory and CanBuildFrom
                          •ODMs
                              • Salat - Case class mapping with some optional annotations, very
                              fast and lightweight
                              • Lift - Popular Scala web framework includes a MongoDB ODM
                              layer based on the ActiveRecord pattern
                          •Next-Generation Drivers (async focus) [Pure rewrites of driver]




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                  •Wraps the Java driver, provides strong Scala API
                                  •Documents manipulated in a 2.8+ collections Map structure including
                                  Builder, Factory and CanBuildFrom
                          •ODMs
                              • Salat - Case class mapping with some optional annotations, very
                              fast and lightweight
                              • Lift - Popular Scala web framework includes a MongoDB ODM
                              layer based on the ActiveRecord pattern
                          •Next-Generation Drivers (async focus) [Pure rewrites of driver]
                              • Hammersmith - my pet project, Netty + Akka.IO interfaces, strongly
                              functional and callback based




Tuesday, October 16, 12
MongoDB + Scala
              • Scala + MongoDB
                          • “Core” MongoDB Driver (casbah)
                                  •Wraps the Java driver, provides strong Scala API
                                  •Documents manipulated in a 2.8+ collections Map structure including
                                  Builder, Factory and CanBuildFrom
                          •ODMs
                              • Salat - Case class mapping with some optional annotations, very
                              fast and lightweight
                              • Lift - Popular Scala web framework includes a MongoDB ODM
                              layer based on the ActiveRecord pattern
                          •Next-Generation Drivers (async focus) [Pure rewrites of driver]
                              • Hammersmith - my pet project, Netty + Akka.IO interfaces, strongly
                              functional and callback based
                              • ReactiveMongo - from the amazing team @ Zenexity who brought us
                              the Play! Framework - new, but very promising



Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                              Casbah’s version of a Document is
                          MongoDBObject, which is a full Scala MapLike
                                         collection

     case class Book(id: ObjectId, author: Seq[Author], isbn: String,
                     price: Price, publicationYear: Int, tags: Seq[String],
                     title: String, publisher: String, edition: Option[String]) {

            def toDBObject = MongoDBObject(
                               "author" -> author.map { a => a.name },
                               "_id" -> id,
                               "isbn" -> isbn,
                               "price" -> price.toDBObject,
                               "publicationYear" -> publicationYear,
                               "tags" -> tags,
                               "title" -> title,
                               "publisher" -> publisher,
                               "edition" -> edition
                             )

     }



Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                          Because it is a full Collection implementation,
                           construction Builder style is easy as well
     val b = MongoDBObject.newBuilder
     b += "foo" -> "bar"
     b += "x" -> 5
     b += "map" -> Map("spam" -> 8.2, "eggs" -> "bacon")
     val dbObj = b.result




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                          Because it is a full Collection implementation,
                           construction Builder style is easy as well
     val b = MongoDBObject.newBuilder
     b += "foo" -> "bar"
     b += "x" -> 5
     b += "map" -> Map("spam" -> 8.2, "eggs" -> "bacon")
     val dbObj = b.result

                          It’s even easy to start with a blank DBObject


     val dbObj = MongoDBObject.empty

     dbObj must beDBObject
     dbObj must have size (0)




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                            While Casbah wraps the Java Driver for the
                          Mongo protocol, its API aims to be as Scala pure
                                             as possible

     val mongo: MongoCollection = MongoConnection()("bookstore")("books")




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                            While Casbah wraps the Java Driver for the
                          Mongo protocol, its API aims to be as Scala pure
                                             as possible

     val mongo: MongoCollection = MongoConnection()("bookstore")("books")


                             Casbah’s Cursors can easily be iterated in
                                       standard Scala style

     def findAll() = for ( book <- mongo.find() ) yield newBook(book)

     findAll().foreach(b => println("<Book> " + b))




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                          Leveraging Scala’s great support for composable
                           DSLs, Casbah provides a Query DSL that feels
                                   natural to a MongoDB user...

        val q: DBObject = ("price" $lt 40.00) ++ ("tag" -> "scala")




Tuesday, October 16, 12
Basic MongoDB + Scala via Casbah
                          Leveraging Scala’s great support for composable
                           DSLs, Casbah provides a Query DSL that feels
                                   natural to a MongoDB user...

        val q: DBObject = ("price" $lt 40.00) ++ ("tag" -> "scala")




                          Like with Java, the Scala MongoDB Community
                          has created a few ways of mapping Objects as
                                               well...




Tuesday, October 16, 12
Object Mapping in Scala via Lift




Tuesday, October 16, 12
Object Mapping in Scala via Lift


                          Lift uses an ActiveRecord style API for mapping
                                         MongoDB + Scala

     class Book private() extends BsonRecord[Book] with ObjectIdPk[Book]
     { }




Tuesday, October 16, 12
Object Mapping in Scala via Lift




Tuesday, October 16, 12
Object Mapping in Scala via Lift
                          Fields in Lift-Mongo are declared as objects
                               implementing a special typed trait.

      object isbn extends StringField(this, 64)




Tuesday, October 16, 12
Object Mapping in Scala via Lift
                           Fields in Lift-Mongo are declared as objects
                                implementing a special typed trait.

      object isbn extends StringField(this, 64)

                          Fields can be declared optional by overriding a
                                          trait attribute

      object edition extends StringField(this, 32) {
        override def optional_? = true
      }




Tuesday, October 16, 12
Object Mapping in Scala via Lift
                           Fields in Lift-Mongo are declared as objects
                                implementing a special typed trait.

      object isbn extends StringField(this, 64)

                          Fields can be declared optional by overriding a
                                          trait attribute

      object edition extends StringField(this, 32) {
        override def optional_? = true
      }

                           And Lists can be automatically handled via a
                                        MongoListField
      object author extends MongoListField[Book, String](this)



Tuesday, October 16, 12
Object Mapping in Scala via Lift




Tuesday, October 16, 12
Object Mapping in Scala via Lift
                          Embedding objects represented by another entity
                                         is easy as well
          object price extends BsonRecordField(this, Price)

          class Price private() extends BsonRecord[Price] {
            // ...
            object currency extends StringField(this, 3)
            object discount extends DoubleField(this)
            object msrp extends DoubleField(this)
          }




Tuesday, October 16, 12
Object Mapping in Scala via Lift
                          Embedding objects represented by another entity
                                         is easy as well
          object price extends BsonRecordField(this, Price)

          class Price private() extends BsonRecord[Price] {
            // ...
            object currency extends StringField(this, 3)
            object discount extends DoubleField(this)
            object msrp extends DoubleField(this)
          }


                          To make working with Lift + MongoDB as easy as
                            possible, Foursquare has created a fantastic
                                      Query DSL called Rogue:
                              https://github.com/foursquare/rogue




Tuesday, October 16, 12
Object Mapping in Scala via Lift




Tuesday, October 16, 12
Object Mapping in Scala via Lift



                          The downside to Lift is the need to use specially
                           structured objects. For those who want a less
                                  formal API, Salat makes it easy...




Tuesday, October 16, 12
Object Mapping in Scala via Salat




Tuesday, October 16, 12
Object Mapping in Scala via Salat
                          Salat uses Scala’s case classes as the core of
                                their model (immutability is good!)
     case class Book(id: ObjectId, author: Seq[Author], isbn: String,
                     price: Price, publicationYear: Int, tags: Seq[String],
                     title: String, publisher: String, edition: Option[String])

     case class Author(name: String)

     case class Price(currency: String, discount: Double, msrp: Double)

     val authors = Seq( Author("Timothy Perrett") )
     val price = Price("USD", 39.99, 39.99)

     val tags = Seq("functional programming", "scala",
                     "web development", "lift", "#legendofklang")

     val liftInAction = Book(new ObjectId, authors, "9781935182801",
                             price, 2011, tags,
                             "Lift in Action",
                             "Manning Publications Co.", Some("First"))




Tuesday, October 16, 12
Object Mapping in Scala via Salat




Tuesday, October 16, 12
Object Mapping in Scala via Salat
                          Persistence is made simple (through Scala
                               reflection) via the Grater object
     /**
      * The Salat Grater uses runtime Scala type reflection to
      * generate a MongoDB Object.
      */
     val dbo = grater[Book].asDBObject(liftInAction)

     mongo.save(dbo)




Tuesday, October 16, 12
Object Mapping in Scala via Salat
                             Persistence is made simple (through Scala
                                  reflection) via the Grater object
     /**
      * The Salat Grater uses runtime Scala type reflection to
      * generate a MongoDB Object.
      */
     val dbo = grater[Book].asDBObject(liftInAction)

     mongo.save(dbo)


                           Some annotations are available to mark indexed
                          fields, etc but the core ideas in Salat are elegantly
                                                  simple




Tuesday, October 16, 12
MongoDB + Clojure




Tuesday, October 16, 12
MongoDB + Clojure


              • Clojure + MongoDB




Tuesday, October 16, 12
MongoDB + Clojure


              • Clojure + MongoDB
                          • “Core” MongoDB Driver (monger)




Tuesday, October 16, 12
MongoDB + Clojure


              • Clojure + MongoDB
                          • “Core” MongoDB Driver (monger)
                             • Fairly new, similarities to Casbah, including a “native”
                             Query API




Tuesday, October 16, 12
MongoDB + Clojure


              • Clojure + MongoDB
                          • “Core” MongoDB Driver (monger)
                             • Fairly new, similarities to Casbah, including a “native”
                             Query API
                             • Not officially supported




Tuesday, October 16, 12
MongoDB + Clojure


              • Clojure + MongoDB
                          • “Core” MongoDB Driver (monger)
                             • Fairly new, similarities to Casbah, including a “native”
                             Query API
                             • Not officially supported
                             • The Monger team was nice enough to share some
                             snippets (my Clojure is a bit rusty)...




Tuesday, October 16, 12
Basic MongoDB + Clojure via Monger




Tuesday, October 16, 12
Basic MongoDB + Clojure via Monger
                             Monger’s version of a Document is a simple
                                       Clojure data structure

                          A Query API similar to Casbah’s is supported, and
                                               very fluid



             (monger.collection/find-maps collection {:price.discount {$lt 25.00}})




             (monger.collection/update "things" { :_id oid } { $set { :weight 20.5 } })




Tuesday, October 16, 12
MongoDB + Hadoop




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                             • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                             MapReduce results directly to MongoDB




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                             • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                             MapReduce results directly to MongoDB
                             • Coming Soon: Read/Write “archived BSON” (basically, MongoDB
                             Backup Files)




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                             • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                             MapReduce results directly to MongoDB
                             • Coming Soon: Read/Write “archived BSON” (basically, MongoDB
                             Backup Files)
              • Support for “Core MapReduce” as well as the wider Hadoop
              ecosystem




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                              • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                              MapReduce results directly to MongoDB
                              • Coming Soon: Read/Write “archived BSON” (basically, MongoDB
                              Backup Files)
              • Support for “Core MapReduce” as well as the wider Hadoop
              ecosystem
                          • Pig




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                             • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                             MapReduce results directly to MongoDB
                             • Coming Soon: Read/Write “archived BSON” (basically, MongoDB
                             Backup Files)
              • Support for “Core MapReduce” as well as the wider Hadoop
              ecosystem
                          • Pig
                          • Streaming




Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                             • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                             MapReduce results directly to MongoDB
                             • Coming Soon: Read/Write “archived BSON” (basically, MongoDB
                             Backup Files)
              • Support for “Core MapReduce” as well as the wider Hadoop
              ecosystem
                          • Pig
                          • Streaming
                          • Hive & Scoobi (coming soon)



Tuesday, October 16, 12
MongoDB + Hadoop
              • Hadoop + MongoDB
                          • Hadoop integration with MongoDB is one of my key projects
                          at 10gen
                             • Feed MongoDB data directly (“live”) into MapReduce jobs & save
                             MapReduce results directly to MongoDB
                             • Coming Soon: Read/Write “archived BSON” (basically, MongoDB
                             Backup Files)
              • Support for “Core MapReduce” as well as the wider Hadoop
              ecosystem
                          • Pig
                          • Streaming
                          • Hive & Scoobi (coming soon)
              • See http://api.mongodb.org/hadoop to learn more


Tuesday, October 16, 12
[Want to Know More About MongoDB?]
                   Free Online Classes, Starting in October!
                        http://education.10gen.com


                                   [Docs]
                             http://mongodb.org
                           http://api.mongodb.org/


                                *Contact Me*
                             brendan@10gen.com
                                 (twitter: @rit)


Tuesday, October 16, 12

Weitere ähnliche Inhalte

Was ist angesagt?

MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...
MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...
MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...MongoDB
 
Practical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo DbPractical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo DbAlex Sharp
 
Transitioning from SQL to MongoDB
Transitioning from SQL to MongoDBTransitioning from SQL to MongoDB
Transitioning from SQL to MongoDBMongoDB
 
Introducing Azure DocumentDB - NoSQL, No Problem
Introducing Azure DocumentDB - NoSQL, No ProblemIntroducing Azure DocumentDB - NoSQL, No Problem
Introducing Azure DocumentDB - NoSQL, No ProblemAndrew Liu
 
Introduction to MongoDB (from Austin Code Camp)
Introduction to MongoDB (from Austin Code Camp)Introduction to MongoDB (from Austin Code Camp)
Introduction to MongoDB (from Austin Code Camp)Chris Edwards
 
Hybrid MongoDB and RDBMS Applications
Hybrid MongoDB and RDBMS ApplicationsHybrid MongoDB and RDBMS Applications
Hybrid MongoDB and RDBMS ApplicationsSteven Francia
 
MongoDB at CodeMash 2.0.1.0
MongoDB at CodeMash 2.0.1.0MongoDB at CodeMash 2.0.1.0
MongoDB at CodeMash 2.0.1.0Mike Dirolf
 
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...MongoDB
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBJustin Smestad
 
Azure DocumentDB: Advanced Features for Large Scale-Apps
Azure DocumentDB: Advanced Features for Large Scale-AppsAzure DocumentDB: Advanced Features for Large Scale-Apps
Azure DocumentDB: Advanced Features for Large Scale-AppsAndrew Liu
 
Conceptos básicos. Seminario web 1: Introducción a NoSQL
Conceptos básicos. Seminario web 1: Introducción a NoSQLConceptos básicos. Seminario web 1: Introducción a NoSQL
Conceptos básicos. Seminario web 1: Introducción a NoSQLMongoDB
 
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)MongoDB
 
Intro To MongoDB
Intro To MongoDBIntro To MongoDB
Intro To MongoDBAlex Sharp
 
Top 10 frameworks of node js
Top 10 frameworks of node jsTop 10 frameworks of node js
Top 10 frameworks of node jsHabilelabs
 
OSCON 2012 MongoDB Tutorial
OSCON 2012 MongoDB TutorialOSCON 2012 MongoDB Tutorial
OSCON 2012 MongoDB TutorialSteven Francia
 

Was ist angesagt? (20)

MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...
MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...
MongoDB Days Silicon Valley: Jumpstart: The Right and Wrong Use Cases for Mon...
 
Practical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo DbPractical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo Db
 
Transitioning from SQL to MongoDB
Transitioning from SQL to MongoDBTransitioning from SQL to MongoDB
Transitioning from SQL to MongoDB
 
Introducing Azure DocumentDB - NoSQL, No Problem
Introducing Azure DocumentDB - NoSQL, No ProblemIntroducing Azure DocumentDB - NoSQL, No Problem
Introducing Azure DocumentDB - NoSQL, No Problem
 
Introduction to MongoDB (from Austin Code Camp)
Introduction to MongoDB (from Austin Code Camp)Introduction to MongoDB (from Austin Code Camp)
Introduction to MongoDB (from Austin Code Camp)
 
Mongo db operations_v2
Mongo db operations_v2Mongo db operations_v2
Mongo db operations_v2
 
Hybrid MongoDB and RDBMS Applications
Hybrid MongoDB and RDBMS ApplicationsHybrid MongoDB and RDBMS Applications
Hybrid MongoDB and RDBMS Applications
 
MongoDB at CodeMash 2.0.1.0
MongoDB at CodeMash 2.0.1.0MongoDB at CodeMash 2.0.1.0
MongoDB at CodeMash 2.0.1.0
 
MongoDB and hadoop
MongoDB and hadoopMongoDB and hadoop
MongoDB and hadoop
 
MongoDB Schema Design Tips & Tricks
MongoDB Schema Design Tips & TricksMongoDB Schema Design Tips & Tricks
MongoDB Schema Design Tips & Tricks
 
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Azure DocumentDB: Advanced Features for Large Scale-Apps
Azure DocumentDB: Advanced Features for Large Scale-AppsAzure DocumentDB: Advanced Features for Large Scale-Apps
Azure DocumentDB: Advanced Features for Large Scale-Apps
 
Conceptos básicos. Seminario web 1: Introducción a NoSQL
Conceptos básicos. Seminario web 1: Introducción a NoSQLConceptos básicos. Seminario web 1: Introducción a NoSQL
Conceptos básicos. Seminario web 1: Introducción a NoSQL
 
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
 
Intro To MongoDB
Intro To MongoDBIntro To MongoDB
Intro To MongoDB
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Top 10 frameworks of node js
Top 10 frameworks of node jsTop 10 frameworks of node js
Top 10 frameworks of node js
 
OSCON 2012 MongoDB Tutorial
OSCON 2012 MongoDB TutorialOSCON 2012 MongoDB Tutorial
OSCON 2012 MongoDB Tutorial
 
MediaGlu and Mongo DB
MediaGlu and Mongo DBMediaGlu and Mongo DB
MediaGlu and Mongo DB
 

Andere mochten auch

The Spring Data MongoDB Project
The Spring Data MongoDB ProjectThe Spring Data MongoDB Project
The Spring Data MongoDB ProjectMongoDB
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know Norberto Leite
 
mongodb-brief-intro-february-2012
mongodb-brief-intro-february-2012mongodb-brief-intro-february-2012
mongodb-brief-intro-february-2012Chris Westin
 
An Evening with MongoDB - Orlando: Welcome and Keynote
An Evening with MongoDB - Orlando: Welcome and KeynoteAn Evening with MongoDB - Orlando: Welcome and Keynote
An Evening with MongoDB - Orlando: Welcome and KeynoteMongoDB
 
Seth Edwards on MongoDB
Seth Edwards on MongoDBSeth Edwards on MongoDB
Seth Edwards on MongoDBSkills Matter
 
Getting Started with MongoDB
Getting Started with MongoDBGetting Started with MongoDB
Getting Started with MongoDBPankaj Bajaj
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBSean Laurent
 
Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)MongoSF
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBKnoldus Inc.
 
Mongodb intro
Mongodb introMongodb intro
Mongodb introchristkv
 
Mastering the MongoDB Javascript Shell
Mastering the MongoDB Javascript ShellMastering the MongoDB Javascript Shell
Mastering the MongoDB Javascript ShellScott Hernandez
 
Intro to NoSQL and MongoDB
 Intro to NoSQL and MongoDB Intro to NoSQL and MongoDB
Intro to NoSQL and MongoDBMongoDB
 
Zero to Mongo in 60 Hours
Zero to Mongo in 60 HoursZero to Mongo in 60 Hours
Zero to Mongo in 60 HoursMongoSF
 

Andere mochten auch (20)

Mongo DB
Mongo DB Mongo DB
Mongo DB
 
The Spring Data MongoDB Project
The Spring Data MongoDB ProjectThe Spring Data MongoDB Project
The Spring Data MongoDB Project
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
MongoDB
MongoDBMongoDB
MongoDB
 
mongodb-brief-intro-february-2012
mongodb-brief-intro-february-2012mongodb-brief-intro-february-2012
mongodb-brief-intro-february-2012
 
An Evening with MongoDB - Orlando: Welcome and Keynote
An Evening with MongoDB - Orlando: Welcome and KeynoteAn Evening with MongoDB - Orlando: Welcome and Keynote
An Evening with MongoDB - Orlando: Welcome and Keynote
 
Seth Edwards on MongoDB
Seth Edwards on MongoDBSeth Edwards on MongoDB
Seth Edwards on MongoDB
 
Getting Started with MongoDB
Getting Started with MongoDBGetting Started with MongoDB
Getting Started with MongoDB
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
MongoDB Devops Madrid February 2012
MongoDB Devops Madrid February 2012MongoDB Devops Madrid February 2012
MongoDB Devops Madrid February 2012
 
Mongodb intro
Mongodb introMongodb intro
Mongodb intro
 
Mastering the MongoDB Javascript Shell
Mastering the MongoDB Javascript ShellMastering the MongoDB Javascript Shell
Mastering the MongoDB Javascript Shell
 
Intro to NoSQL and MongoDB
 Intro to NoSQL and MongoDB Intro to NoSQL and MongoDB
Intro to NoSQL and MongoDB
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
MongoDB 3.0
MongoDB 3.0 MongoDB 3.0
MongoDB 3.0
 
Plan de entrenamiento Maratón de Madrid Mes 3
Plan de entrenamiento Maratón de Madrid Mes 3Plan de entrenamiento Maratón de Madrid Mes 3
Plan de entrenamiento Maratón de Madrid Mes 3
 
Mongo db intro new
Mongo db intro newMongo db intro new
Mongo db intro new
 
Zero to Mongo in 60 Hours
Zero to Mongo in 60 HoursZero to Mongo in 60 Hours
Zero to Mongo in 60 Hours
 

Ähnlich wie Mongo DB on the JVM - Brendan McAdams

Webinar: MongoDB on the JVM
Webinar: MongoDB on the JVMWebinar: MongoDB on the JVM
Webinar: MongoDB on the JVMMongoDB
 
Building a MongoDB App with Perl
Building a MongoDB App with PerlBuilding a MongoDB App with Perl
Building a MongoDB App with PerlMike Friedman
 
Mongo db php_shaken_not_stirred_joomlafrappe
Mongo db php_shaken_not_stirred_joomlafrappeMongo db php_shaken_not_stirred_joomlafrappe
Mongo db php_shaken_not_stirred_joomlafrappeSpyros Passas
 
Jumpstart: Building Your First MongoDB App
Jumpstart: Building Your First MongoDB AppJumpstart: Building Your First MongoDB App
Jumpstart: Building Your First MongoDB AppMongoDB
 
Schema Design
Schema DesignSchema Design
Schema DesignMongoDB
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBCali Mongo
 
Schema design mongo_boston
Schema design mongo_bostonSchema design mongo_boston
Schema design mongo_bostonMongoDB
 
Mongo db present
Mongo db presentMongo db present
Mongo db presentscottmsims
 
The elephant in the room mongo db + hadoop
The elephant in the room  mongo db + hadoopThe elephant in the room  mongo db + hadoop
The elephant in the room mongo db + hadoopiammutex
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
 
Mongodbworkshop I: get started
Mongodbworkshop I: get startedMongodbworkshop I: get started
Mongodbworkshop I: get startedVivian S. Zhang
 
Schema Design
Schema DesignSchema Design
Schema DesignMongoDB
 
10gen MongoDB Video Presentation at WebGeek DevCup
10gen MongoDB Video Presentation at WebGeek DevCup10gen MongoDB Video Presentation at WebGeek DevCup
10gen MongoDB Video Presentation at WebGeek DevCupWebGeek Philippines
 
Building your first app with mongo db
Building your first app with mongo dbBuilding your first app with mongo db
Building your first app with mongo dbMongoDB
 
Introduction to MongoDB and Workshop
Introduction to MongoDB and WorkshopIntroduction to MongoDB and Workshop
Introduction to MongoDB and WorkshopAhmedabadJavaMeetup
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBMike Dirolf
 
Intro To Mongo Db
Intro To Mongo DbIntro To Mongo Db
Intro To Mongo Dbchriskite
 

Ähnlich wie Mongo DB on the JVM - Brendan McAdams (20)

Webinar: MongoDB on the JVM
Webinar: MongoDB on the JVMWebinar: MongoDB on the JVM
Webinar: MongoDB on the JVM
 
Building a MongoDB App with Perl
Building a MongoDB App with PerlBuilding a MongoDB App with Perl
Building a MongoDB App with Perl
 
Mongo db php_shaken_not_stirred_joomlafrappe
Mongo db php_shaken_not_stirred_joomlafrappeMongo db php_shaken_not_stirred_joomlafrappe
Mongo db php_shaken_not_stirred_joomlafrappe
 
Starting with MongoDB
Starting with MongoDBStarting with MongoDB
Starting with MongoDB
 
Jumpstart: Building Your First MongoDB App
Jumpstart: Building Your First MongoDB AppJumpstart: Building Your First MongoDB App
Jumpstart: Building Your First MongoDB App
 
Schema Design
Schema DesignSchema Design
Schema Design
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Schema design mongo_boston
Schema design mongo_bostonSchema design mongo_boston
Schema design mongo_boston
 
Mongo db present
Mongo db presentMongo db present
Mongo db present
 
The elephant in the room mongo db + hadoop
The elephant in the room  mongo db + hadoopThe elephant in the room  mongo db + hadoop
The elephant in the room mongo db + hadoop
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
 
Mongodbworkshop I: get started
Mongodbworkshop I: get startedMongodbworkshop I: get started
Mongodbworkshop I: get started
 
MongoDB Workshop
MongoDB WorkshopMongoDB Workshop
MongoDB Workshop
 
Schema Design
Schema DesignSchema Design
Schema Design
 
10gen MongoDB Video Presentation at WebGeek DevCup
10gen MongoDB Video Presentation at WebGeek DevCup10gen MongoDB Video Presentation at WebGeek DevCup
10gen MongoDB Video Presentation at WebGeek DevCup
 
Building your first app with mongo db
Building your first app with mongo dbBuilding your first app with mongo db
Building your first app with mongo db
 
Atlogys Academy - Tech Talk on Mongo DB
Atlogys Academy - Tech Talk on Mongo DBAtlogys Academy - Tech Talk on Mongo DB
Atlogys Academy - Tech Talk on Mongo DB
 
Introduction to MongoDB and Workshop
Introduction to MongoDB and WorkshopIntroduction to MongoDB and Workshop
Introduction to MongoDB and Workshop
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Intro To Mongo Db
Intro To Mongo DbIntro To Mongo Db
Intro To Mongo Db
 

Mehr von JAX London

Everything I know about software in spaghetti bolognese: managing complexity
Everything I know about software in spaghetti bolognese: managing complexityEverything I know about software in spaghetti bolognese: managing complexity
Everything I know about software in spaghetti bolognese: managing complexityJAX London
 
Devops with the S for Sharing - Patrick Debois
Devops with the S for Sharing - Patrick DeboisDevops with the S for Sharing - Patrick Debois
Devops with the S for Sharing - Patrick DeboisJAX London
 
Busy Developer's Guide to Windows 8 HTML/JavaScript Apps
Busy Developer's Guide to Windows 8 HTML/JavaScript AppsBusy Developer's Guide to Windows 8 HTML/JavaScript Apps
Busy Developer's Guide to Windows 8 HTML/JavaScript AppsJAX London
 
It's code but not as we know: Infrastructure as Code - Patrick Debois
It's code but not as we know: Infrastructure as Code - Patrick DeboisIt's code but not as we know: Infrastructure as Code - Patrick Debois
It's code but not as we know: Infrastructure as Code - Patrick DeboisJAX London
 
Locks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael BarkerLocks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael BarkerJAX London
 
Worse is better, for better or for worse - Kevlin Henney
Worse is better, for better or for worse - Kevlin HenneyWorse is better, for better or for worse - Kevlin Henney
Worse is better, for better or for worse - Kevlin HenneyJAX London
 
Java performance: What's the big deal? - Trisha Gee
Java performance: What's the big deal? - Trisha GeeJava performance: What's the big deal? - Trisha Gee
Java performance: What's the big deal? - Trisha GeeJAX London
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John StevensonJAX London
 
HTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias Wessendorf
HTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias WessendorfHTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias Wessendorf
HTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias WessendorfJAX London
 
Play framework 2 : Peter Hilton
Play framework 2 : Peter HiltonPlay framework 2 : Peter Hilton
Play framework 2 : Peter HiltonJAX London
 
Complexity theory and software development : Tim Berglund
Complexity theory and software development : Tim BerglundComplexity theory and software development : Tim Berglund
Complexity theory and software development : Tim BerglundJAX London
 
Why FLOSS is a Java developer's best friend: Dave Gruber
Why FLOSS is a Java developer's best friend: Dave GruberWhy FLOSS is a Java developer's best friend: Dave Gruber
Why FLOSS is a Java developer's best friend: Dave GruberJAX London
 
Akka in Action: Heiko Seeburger
Akka in Action: Heiko SeeburgerAkka in Action: Heiko Seeburger
Akka in Action: Heiko SeeburgerJAX London
 
NoSQL Smackdown 2012 : Tim Berglund
NoSQL Smackdown 2012 : Tim BerglundNoSQL Smackdown 2012 : Tim Berglund
NoSQL Smackdown 2012 : Tim BerglundJAX London
 
Closures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel WinderClosures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel WinderJAX London
 
Java and the machine - Martijn Verburg and Kirk Pepperdine
Java and the machine - Martijn Verburg and Kirk PepperdineJava and the machine - Martijn Verburg and Kirk Pepperdine
Java and the machine - Martijn Verburg and Kirk PepperdineJAX London
 
New opportunities for connected data - Ian Robinson
New opportunities for connected data - Ian RobinsonNew opportunities for connected data - Ian Robinson
New opportunities for connected data - Ian RobinsonJAX London
 
HTML5 Websockets and Java - Arun Gupta
HTML5 Websockets and Java - Arun GuptaHTML5 Websockets and Java - Arun Gupta
HTML5 Websockets and Java - Arun GuptaJAX London
 
The Big Data Con: Why Big Data is a Problem, not a Solution - Ian Plosker
The Big Data Con: Why Big Data is a Problem, not a Solution - Ian PloskerThe Big Data Con: Why Big Data is a Problem, not a Solution - Ian Plosker
The Big Data Con: Why Big Data is a Problem, not a Solution - Ian PloskerJAX London
 
Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...
Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...
Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...JAX London
 

Mehr von JAX London (20)

Everything I know about software in spaghetti bolognese: managing complexity
Everything I know about software in spaghetti bolognese: managing complexityEverything I know about software in spaghetti bolognese: managing complexity
Everything I know about software in spaghetti bolognese: managing complexity
 
Devops with the S for Sharing - Patrick Debois
Devops with the S for Sharing - Patrick DeboisDevops with the S for Sharing - Patrick Debois
Devops with the S for Sharing - Patrick Debois
 
Busy Developer's Guide to Windows 8 HTML/JavaScript Apps
Busy Developer's Guide to Windows 8 HTML/JavaScript AppsBusy Developer's Guide to Windows 8 HTML/JavaScript Apps
Busy Developer's Guide to Windows 8 HTML/JavaScript Apps
 
It's code but not as we know: Infrastructure as Code - Patrick Debois
It's code but not as we know: Infrastructure as Code - Patrick DeboisIt's code but not as we know: Infrastructure as Code - Patrick Debois
It's code but not as we know: Infrastructure as Code - Patrick Debois
 
Locks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael BarkerLocks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael Barker
 
Worse is better, for better or for worse - Kevlin Henney
Worse is better, for better or for worse - Kevlin HenneyWorse is better, for better or for worse - Kevlin Henney
Worse is better, for better or for worse - Kevlin Henney
 
Java performance: What's the big deal? - Trisha Gee
Java performance: What's the big deal? - Trisha GeeJava performance: What's the big deal? - Trisha Gee
Java performance: What's the big deal? - Trisha Gee
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John Stevenson
 
HTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias Wessendorf
HTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias WessendorfHTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias Wessendorf
HTML alchemy: the secrets of mixing JavaScript and Java EE - Matthias Wessendorf
 
Play framework 2 : Peter Hilton
Play framework 2 : Peter HiltonPlay framework 2 : Peter Hilton
Play framework 2 : Peter Hilton
 
Complexity theory and software development : Tim Berglund
Complexity theory and software development : Tim BerglundComplexity theory and software development : Tim Berglund
Complexity theory and software development : Tim Berglund
 
Why FLOSS is a Java developer's best friend: Dave Gruber
Why FLOSS is a Java developer's best friend: Dave GruberWhy FLOSS is a Java developer's best friend: Dave Gruber
Why FLOSS is a Java developer's best friend: Dave Gruber
 
Akka in Action: Heiko Seeburger
Akka in Action: Heiko SeeburgerAkka in Action: Heiko Seeburger
Akka in Action: Heiko Seeburger
 
NoSQL Smackdown 2012 : Tim Berglund
NoSQL Smackdown 2012 : Tim BerglundNoSQL Smackdown 2012 : Tim Berglund
NoSQL Smackdown 2012 : Tim Berglund
 
Closures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel WinderClosures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel Winder
 
Java and the machine - Martijn Verburg and Kirk Pepperdine
Java and the machine - Martijn Verburg and Kirk PepperdineJava and the machine - Martijn Verburg and Kirk Pepperdine
Java and the machine - Martijn Verburg and Kirk Pepperdine
 
New opportunities for connected data - Ian Robinson
New opportunities for connected data - Ian RobinsonNew opportunities for connected data - Ian Robinson
New opportunities for connected data - Ian Robinson
 
HTML5 Websockets and Java - Arun Gupta
HTML5 Websockets and Java - Arun GuptaHTML5 Websockets and Java - Arun Gupta
HTML5 Websockets and Java - Arun Gupta
 
The Big Data Con: Why Big Data is a Problem, not a Solution - Ian Plosker
The Big Data Con: Why Big Data is a Problem, not a Solution - Ian PloskerThe Big Data Con: Why Big Data is a Problem, not a Solution - Ian Plosker
The Big Data Con: Why Big Data is a Problem, not a Solution - Ian Plosker
 
Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...
Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...
Bluffers guide to elitist jargon - Martijn Verburg, Richard Warburton, James ...
 

Kürzlich hochgeladen

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 

Kürzlich hochgeladen (20)

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 

Mongo DB on the JVM - Brendan McAdams

  • 1. MongoDB + the JVM Integrating NoSQL with the JVM Brendan McAdams 10gen, Inc. brendan@10gen.com @rit Tuesday, October 16, 12
  • 2. Let’s Face It ... SQL Sucks. Tuesday, October 16, 12
  • 3. Let’s Face It ... SQL Sucks. For some problems at least. Tuesday, October 16, 12
  • 4. Stuffing an object graph into a relational model is like fitting a square peg into a round hole. Tuesday, October 16, 12
  • 5. Stuffing an object graph into a relational model is like fitting a square peg into a round hole. Databases should simplify application development - they should present a model that fits naturally with our code Tuesday, October 16, 12
  • 6. MongoDB as a Database Tuesday, October 16, 12
  • 7. MongoDB as a Database • MongoDB is designed to fit your application Tuesday, October 16, 12
  • 8. MongoDB as a Database • MongoDB is designed to fit your application • Flexible Tuesday, October 16, 12
  • 9. MongoDB as a Database • MongoDB is designed to fit your application • Flexible • Fast Tuesday, October 16, 12
  • 10. MongoDB as a Database • MongoDB is designed to fit your application • Flexible • Fast • Sane Tuesday, October 16, 12
  • 11. MongoDB as a Database Tuesday, October 16, 12
  • 12. MongoDB as a Database • Two crucial core concepts Tuesday, October 16, 12
  • 13. MongoDB as a Database • Two crucial core concepts • Document Oriented Data Tuesday, October 16, 12
  • 14. MongoDB as a Database • Two crucial core concepts • Document Oriented Data • Scalability Tuesday, October 16, 12
  • 15. MongoDB as a Database Tuesday, October 16, 12
  • 16. MongoDB as a Database • Document Oriented Data Tuesday, October 16, 12
  • 17. MongoDB as a Database • Document Oriented Data • Instead of flat row structures, “document oriented” data (similar to JSON) Tuesday, October 16, 12
  • 18. MongoDB as a Database • Document Oriented Data • Instead of flat row structures, “document oriented” data (similar to JSON) • Rich: Embed other documents and arrays as values Tuesday, October 16, 12
  • 19. Rich Documents Represent MongoDB Data { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “publisher”: “The Pragmatic Programmers, LLC”, } Tuesday, October 16, 12
  • 20. Rich Documents Represent MongoDB Data { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “publisher”: “The Pragmatic Programmers, LLC”, } Like JSON , MongoDB Documents are made up of key and value pairs. Tuesday, October 16, 12
  • 21. Rich Documents Represent MongoDB Data Tuesday, October 16, 12
  • 22. Rich Documents Represent MongoDB Data { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, } Values can be complex, such as embedded subdocuments... Tuesday, October 16, 12
  • 23. Rich Documents Represent MongoDB Data Tuesday, October 16, 12
  • 24. Rich Documents Represent MongoDB Data { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] Or even arrays! } Tuesday, October 16, 12
  • 26. Querying with MongoDB • Querying in MongoDB is similar to a ‘query by example’ interface Tuesday, October 16, 12
  • 27. Querying with MongoDB • Querying in MongoDB is similar to a ‘query by example’ interface Tuesday, October 16, 12
  • 28. Querying with MongoDB • Querying in MongoDB is similar to a ‘query by example’ interface • Finding items by exact match via “key” = “value” Tuesday, October 16, 12
  • 29. Querying with MongoDB • Querying in MongoDB is similar to a ‘query by example’ interface • Finding items by exact match via “key” = “value” • Built-in Query Expressions for more advanced statements Tuesday, October 16, 12
  • 30. Querying With MongoDB > db.books.find({“author”: “Joe Armstrong”}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Tuesday, October 16, 12
  • 31. Querying With MongoDB > db.books.find({“author”: “Joe Armstrong”}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Basic queries consist of “key” = “value” Tuesday, October 16, 12
  • 32. Querying With MongoDB > db.books.find({“price.currency”: “USD”}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Tuesday, October 16, 12
  • 33. Querying With MongoDB > db.books.find({“price.currency”: “USD”}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Embedded docs can be accessed by “key.subkey” = “value” Tuesday, October 16, 12
  • 34. Querying With MongoDB > db.books.find({“tags”: “multicore”}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Tuesday, October 16, 12
  • 35. Querying With MongoDB > db.books.find({“tags”: “multicore”}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Embedded arrays can be accessed by matching just a single value from the array Tuesday, October 16, 12
  • 36. Querying With MongoDB > db.books.find({“price.discount”: {$lt: 25.00}}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Tuesday, October 16, 12
  • 37. Querying With MongoDB > db.books.find({“price.discount”: {$lt: 25.00}}) { “title”: “Programming Erlang: Software for a Concurrent World”, “author”: “Joe Armstrong”, “publicationYear”: 2007, “price”: { "currency": "USD", "discount": 24.14, "msrp": 36.95 }, “publisher”: “The Pragmatic Programmers, LLC”, “tags”: [ “erlang”, “concurrent programming”, “multicore”, “programming” ] } Finally, MongoDB provides a set of query expressions for concepts such as greater than, less than, etc. Tuesday, October 16, 12
  • 38. MongoDB as a Database Tuesday, October 16, 12
  • 39. MongoDB as a Database • Scalability Tuesday, October 16, 12
  • 40. MongoDB as a Database • Scalability • Database should grow and scale with our application Tuesday, October 16, 12
  • 41. MongoDB as a Database • Scalability • Database should grow and scale with our application • Replica Sets: Robust, modernized Replication Model with automatic failover Tuesday, October 16, 12
  • 42. MongoDB as a Database • Scalability • Database should grow and scale with our application • Replica Sets: Robust, modernized Replication Model with automatic failover • Sharding: n-scalable horizontal partitioning with automatic management Tuesday, October 16, 12
  • 43. MongoDB on the JVM Tuesday, October 16, 12
  • 44. MongoDB on the JVM • MongoDB has strong, wide support on the JVM Tuesday, October 16, 12
  • 45. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • Java Tuesday, October 16, 12
  • 46. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • Java • Scala Tuesday, October 16, 12
  • 47. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • Java • Scala • Hadoop Tuesday, October 16, 12
  • 48. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • Java • Scala • Hadoop • Also, fantastic work occurring in Clojure community (see Monger - http://clojuremongodb.info/ ) Tuesday, October 16, 12
  • 49. MongoDB + Java Tuesday, October 16, 12
  • 50. MongoDB + Java • Java + MongoDB Tuesday, October 16, 12
  • 51. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) Tuesday, October 16, 12
  • 52. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures Tuesday, October 16, 12
  • 53. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures • “Object Document Mapping” (like Hibernate, but less painful) Tuesday, October 16, 12
  • 54. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures • “Object Document Mapping” (like Hibernate, but less painful) • Morphia Tuesday, October 16, 12
  • 55. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures • “Object Document Mapping” (like Hibernate, but less painful) • Morphia • Map domain objects to MongoDB with JPA-like annotations Tuesday, October 16, 12
  • 56. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures • “Object Document Mapping” (like Hibernate, but less painful) • Morphia • Map domain objects to MongoDB with JPA-like annotations • Spring Data Tuesday, October 16, 12
  • 57. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures • “Object Document Mapping” (like Hibernate, but less painful) • Morphia • Map domain objects to MongoDB with JPA-like annotations • Spring Data • Spring ODM for many NoSQL databases, supports MongoDB Tuesday, October 16, 12
  • 58. MongoDB + Java • Java + MongoDB • “Core” MongoDB Driver (mongo-java-driver) • Manipulate MongoDB Docs as Map-like structures • “Object Document Mapping” (like Hibernate, but less painful) • Morphia • Map domain objects to MongoDB with JPA-like annotations • Spring Data • Spring ODM for many NoSQL databases, supports MongoDB • GA Release announced today Tuesday, October 16, 12
  • 59. Core MongoDB + Java Tuesday, October 16, 12
  • 60. Core MongoDB + Java The Mongo class represents a connection pool com.mongodb.Mongo m = new Mongo(); Tuesday, October 16, 12
  • 61. Core MongoDB + Java The Mongo class represents a connection pool com.mongodb.Mongo m = new Mongo(); The DB class represents a Database context com.mongodb.DB db = m.getDB( "bookstore" ); Tuesday, October 16, 12
  • 62. Core MongoDB + Java The Mongo class represents a connection pool com.mongodb.Mongo m = new Mongo(); The DB class represents a Database context com.mongodb.DB db = m.getDB( "bookstore" ); The DBCollection class represents a Collection (Mongo’s version of a table) handle com.mongodb.DBCollection coll = db.getCollection( "books" ); Tuesday, October 16, 12
  • 63. Core MongoDB + Java Tuesday, October 16, 12
  • 64. Core MongoDB + Java Documents are represented by DBObject com.mongodb.DBObject q = new BasicDBObject(); q.put( “tag”, “scala” ); q.put( “price”, new BasicDBObject( “$lt”, 40.00 ) ); Tuesday, October 16, 12
  • 65. Core MongoDB + Java Documents are represented by DBObject com.mongodb.DBObject q = new BasicDBObject(); q.put( “tag”, “scala” ); q.put( “price”, new BasicDBObject( “$lt”, 40.00 ) ); Queries return a DBCursor, which is both Iterator<DBObject> and Iterable<DBObject> for ( DBObject doc : coll.find( q ) ) { // ... } Tuesday, October 16, 12
  • 66. Core MongoDB + Java Tuesday, October 16, 12
  • 67. Core MongoDB + Java There is also a QueryBuilder helper class for querying DBObject q = QueryBuilder.start( “price” ).lessThan( 40.00 ). and( “tag” ).is( “scala” ).get(); Tuesday, October 16, 12
  • 68. Core MongoDB + Java There is also a QueryBuilder helper class for querying DBObject q = QueryBuilder.start( “price” ).lessThan( 40.00 ). and( “tag” ).is( “scala” ).get(); If you don’t fancy doing everything by hand, you can use tools like Morphia to map domain objects automatically... Tuesday, October 16, 12
  • 69. Object Mapping Java via Morphia Tuesday, October 16, 12
  • 70. Object Mapping Java via Morphia Morphia uses JPA-like Annotations to mark up domain objects for MongoDB persistence @Entity("books") // Book classes persist to / from “books” class Book {} Tuesday, October 16, 12
  • 71. Object Mapping Java via Morphia Morphia uses JPA-like Annotations to mark up domain objects for MongoDB persistence @Entity("books") // Book classes persist to / from “books” class Book {} Any field can be tagged as the primary key via the @Id annotation @Id private ObjectId id; Tuesday, October 16, 12
  • 72. Object Mapping Java via Morphia Morphia uses JPA-like Annotations to mark up domain objects for MongoDB persistence @Entity("books") // Book classes persist to / from “books” class Book {} Any field can be tagged as the primary key via the @Id annotation @Id private ObjectId id; List fields are automatically persisted as MongoDB arrays private List<String> tags = new ArrayList<String>(); Tuesday, October 16, 12
  • 73. Object Mapping Java via Morphia Tuesday, October 16, 12
  • 74. Object Mapping Java via Morphia Complex sub-objects can be marked to either “embed” or “reference” automatically /** * Could also use "reference", which are stored to * their own collection and loaded automatically * * Morphia uses the field name for where to store the value, */ @Embedded private Price price; Tuesday, October 16, 12
  • 75. Object Mapping Java via Morphia Complex sub-objects can be marked to either “embed” or “reference” automatically /** * Could also use "reference", which are stored to * their own collection and loaded automatically * * Morphia uses the field name for where to store the value, */ @Embedded private Price price; It’s trivial to name a field one thing in MongoDB and another in our Morphia model /** * Can rename a field for how stored in MongoDB */ @Property("publicationYear") private int year; Tuesday, October 16, 12
  • 76. MongoDB + Scala Tuesday, October 16, 12
  • 77. MongoDB + Scala • Scala + MongoDB Tuesday, October 16, 12
  • 78. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) Tuesday, October 16, 12
  • 79. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API Tuesday, October 16, 12
  • 80. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom Tuesday, October 16, 12
  • 81. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom •ODMs Tuesday, October 16, 12
  • 82. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom •ODMs • Salat - Case class mapping with some optional annotations, very fast and lightweight Tuesday, October 16, 12
  • 83. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom •ODMs • Salat - Case class mapping with some optional annotations, very fast and lightweight • Lift - Popular Scala web framework includes a MongoDB ODM layer based on the ActiveRecord pattern Tuesday, October 16, 12
  • 84. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom •ODMs • Salat - Case class mapping with some optional annotations, very fast and lightweight • Lift - Popular Scala web framework includes a MongoDB ODM layer based on the ActiveRecord pattern •Next-Generation Drivers (async focus) [Pure rewrites of driver] Tuesday, October 16, 12
  • 85. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom •ODMs • Salat - Case class mapping with some optional annotations, very fast and lightweight • Lift - Popular Scala web framework includes a MongoDB ODM layer based on the ActiveRecord pattern •Next-Generation Drivers (async focus) [Pure rewrites of driver] • Hammersmith - my pet project, Netty + Akka.IO interfaces, strongly functional and callback based Tuesday, October 16, 12
  • 86. MongoDB + Scala • Scala + MongoDB • “Core” MongoDB Driver (casbah) •Wraps the Java driver, provides strong Scala API •Documents manipulated in a 2.8+ collections Map structure including Builder, Factory and CanBuildFrom •ODMs • Salat - Case class mapping with some optional annotations, very fast and lightweight • Lift - Popular Scala web framework includes a MongoDB ODM layer based on the ActiveRecord pattern •Next-Generation Drivers (async focus) [Pure rewrites of driver] • Hammersmith - my pet project, Netty + Akka.IO interfaces, strongly functional and callback based • ReactiveMongo - from the amazing team @ Zenexity who brought us the Play! Framework - new, but very promising Tuesday, October 16, 12
  • 87. Basic MongoDB + Scala via Casbah Tuesday, October 16, 12
  • 88. Basic MongoDB + Scala via Casbah Casbah’s version of a Document is MongoDBObject, which is a full Scala MapLike collection case class Book(id: ObjectId, author: Seq[Author], isbn: String, price: Price, publicationYear: Int, tags: Seq[String], title: String, publisher: String, edition: Option[String]) { def toDBObject = MongoDBObject( "author" -> author.map { a => a.name }, "_id" -> id, "isbn" -> isbn, "price" -> price.toDBObject, "publicationYear" -> publicationYear, "tags" -> tags, "title" -> title, "publisher" -> publisher, "edition" -> edition ) } Tuesday, October 16, 12
  • 89. Basic MongoDB + Scala via Casbah Tuesday, October 16, 12
  • 90. Basic MongoDB + Scala via Casbah Because it is a full Collection implementation, construction Builder style is easy as well val b = MongoDBObject.newBuilder b += "foo" -> "bar" b += "x" -> 5 b += "map" -> Map("spam" -> 8.2, "eggs" -> "bacon") val dbObj = b.result Tuesday, October 16, 12
  • 91. Basic MongoDB + Scala via Casbah Because it is a full Collection implementation, construction Builder style is easy as well val b = MongoDBObject.newBuilder b += "foo" -> "bar" b += "x" -> 5 b += "map" -> Map("spam" -> 8.2, "eggs" -> "bacon") val dbObj = b.result It’s even easy to start with a blank DBObject val dbObj = MongoDBObject.empty dbObj must beDBObject dbObj must have size (0) Tuesday, October 16, 12
  • 92. Basic MongoDB + Scala via Casbah Tuesday, October 16, 12
  • 93. Basic MongoDB + Scala via Casbah While Casbah wraps the Java Driver for the Mongo protocol, its API aims to be as Scala pure as possible val mongo: MongoCollection = MongoConnection()("bookstore")("books") Tuesday, October 16, 12
  • 94. Basic MongoDB + Scala via Casbah While Casbah wraps the Java Driver for the Mongo protocol, its API aims to be as Scala pure as possible val mongo: MongoCollection = MongoConnection()("bookstore")("books") Casbah’s Cursors can easily be iterated in standard Scala style def findAll() = for ( book <- mongo.find() ) yield newBook(book) findAll().foreach(b => println("<Book> " + b)) Tuesday, October 16, 12
  • 95. Basic MongoDB + Scala via Casbah Tuesday, October 16, 12
  • 96. Basic MongoDB + Scala via Casbah Leveraging Scala’s great support for composable DSLs, Casbah provides a Query DSL that feels natural to a MongoDB user... val q: DBObject = ("price" $lt 40.00) ++ ("tag" -> "scala") Tuesday, October 16, 12
  • 97. Basic MongoDB + Scala via Casbah Leveraging Scala’s great support for composable DSLs, Casbah provides a Query DSL that feels natural to a MongoDB user... val q: DBObject = ("price" $lt 40.00) ++ ("tag" -> "scala") Like with Java, the Scala MongoDB Community has created a few ways of mapping Objects as well... Tuesday, October 16, 12
  • 98. Object Mapping in Scala via Lift Tuesday, October 16, 12
  • 99. Object Mapping in Scala via Lift Lift uses an ActiveRecord style API for mapping MongoDB + Scala class Book private() extends BsonRecord[Book] with ObjectIdPk[Book] { } Tuesday, October 16, 12
  • 100. Object Mapping in Scala via Lift Tuesday, October 16, 12
  • 101. Object Mapping in Scala via Lift Fields in Lift-Mongo are declared as objects implementing a special typed trait. object isbn extends StringField(this, 64) Tuesday, October 16, 12
  • 102. Object Mapping in Scala via Lift Fields in Lift-Mongo are declared as objects implementing a special typed trait. object isbn extends StringField(this, 64) Fields can be declared optional by overriding a trait attribute object edition extends StringField(this, 32) { override def optional_? = true } Tuesday, October 16, 12
  • 103. Object Mapping in Scala via Lift Fields in Lift-Mongo are declared as objects implementing a special typed trait. object isbn extends StringField(this, 64) Fields can be declared optional by overriding a trait attribute object edition extends StringField(this, 32) { override def optional_? = true } And Lists can be automatically handled via a MongoListField object author extends MongoListField[Book, String](this) Tuesday, October 16, 12
  • 104. Object Mapping in Scala via Lift Tuesday, October 16, 12
  • 105. Object Mapping in Scala via Lift Embedding objects represented by another entity is easy as well object price extends BsonRecordField(this, Price) class Price private() extends BsonRecord[Price] { // ... object currency extends StringField(this, 3) object discount extends DoubleField(this) object msrp extends DoubleField(this) } Tuesday, October 16, 12
  • 106. Object Mapping in Scala via Lift Embedding objects represented by another entity is easy as well object price extends BsonRecordField(this, Price) class Price private() extends BsonRecord[Price] { // ... object currency extends StringField(this, 3) object discount extends DoubleField(this) object msrp extends DoubleField(this) } To make working with Lift + MongoDB as easy as possible, Foursquare has created a fantastic Query DSL called Rogue: https://github.com/foursquare/rogue Tuesday, October 16, 12
  • 107. Object Mapping in Scala via Lift Tuesday, October 16, 12
  • 108. Object Mapping in Scala via Lift The downside to Lift is the need to use specially structured objects. For those who want a less formal API, Salat makes it easy... Tuesday, October 16, 12
  • 109. Object Mapping in Scala via Salat Tuesday, October 16, 12
  • 110. Object Mapping in Scala via Salat Salat uses Scala’s case classes as the core of their model (immutability is good!) case class Book(id: ObjectId, author: Seq[Author], isbn: String, price: Price, publicationYear: Int, tags: Seq[String], title: String, publisher: String, edition: Option[String]) case class Author(name: String) case class Price(currency: String, discount: Double, msrp: Double) val authors = Seq( Author("Timothy Perrett") ) val price = Price("USD", 39.99, 39.99) val tags = Seq("functional programming", "scala", "web development", "lift", "#legendofklang") val liftInAction = Book(new ObjectId, authors, "9781935182801", price, 2011, tags, "Lift in Action", "Manning Publications Co.", Some("First")) Tuesday, October 16, 12
  • 111. Object Mapping in Scala via Salat Tuesday, October 16, 12
  • 112. Object Mapping in Scala via Salat Persistence is made simple (through Scala reflection) via the Grater object /** * The Salat Grater uses runtime Scala type reflection to * generate a MongoDB Object. */ val dbo = grater[Book].asDBObject(liftInAction) mongo.save(dbo) Tuesday, October 16, 12
  • 113. Object Mapping in Scala via Salat Persistence is made simple (through Scala reflection) via the Grater object /** * The Salat Grater uses runtime Scala type reflection to * generate a MongoDB Object. */ val dbo = grater[Book].asDBObject(liftInAction) mongo.save(dbo) Some annotations are available to mark indexed fields, etc but the core ideas in Salat are elegantly simple Tuesday, October 16, 12
  • 114. MongoDB + Clojure Tuesday, October 16, 12
  • 115. MongoDB + Clojure • Clojure + MongoDB Tuesday, October 16, 12
  • 116. MongoDB + Clojure • Clojure + MongoDB • “Core” MongoDB Driver (monger) Tuesday, October 16, 12
  • 117. MongoDB + Clojure • Clojure + MongoDB • “Core” MongoDB Driver (monger) • Fairly new, similarities to Casbah, including a “native” Query API Tuesday, October 16, 12
  • 118. MongoDB + Clojure • Clojure + MongoDB • “Core” MongoDB Driver (monger) • Fairly new, similarities to Casbah, including a “native” Query API • Not officially supported Tuesday, October 16, 12
  • 119. MongoDB + Clojure • Clojure + MongoDB • “Core” MongoDB Driver (monger) • Fairly new, similarities to Casbah, including a “native” Query API • Not officially supported • The Monger team was nice enough to share some snippets (my Clojure is a bit rusty)... Tuesday, October 16, 12
  • 120. Basic MongoDB + Clojure via Monger Tuesday, October 16, 12
  • 121. Basic MongoDB + Clojure via Monger Monger’s version of a Document is a simple Clojure data structure A Query API similar to Casbah’s is supported, and very fluid (monger.collection/find-maps collection {:price.discount {$lt 25.00}}) (monger.collection/update "things" { :_id oid } { $set { :weight 20.5 } }) Tuesday, October 16, 12
  • 122. MongoDB + Hadoop Tuesday, October 16, 12
  • 123. MongoDB + Hadoop • Hadoop + MongoDB Tuesday, October 16, 12
  • 124. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen Tuesday, October 16, 12
  • 125. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB Tuesday, October 16, 12
  • 126. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB • Coming Soon: Read/Write “archived BSON” (basically, MongoDB Backup Files) Tuesday, October 16, 12
  • 127. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB • Coming Soon: Read/Write “archived BSON” (basically, MongoDB Backup Files) • Support for “Core MapReduce” as well as the wider Hadoop ecosystem Tuesday, October 16, 12
  • 128. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB • Coming Soon: Read/Write “archived BSON” (basically, MongoDB Backup Files) • Support for “Core MapReduce” as well as the wider Hadoop ecosystem • Pig Tuesday, October 16, 12
  • 129. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB • Coming Soon: Read/Write “archived BSON” (basically, MongoDB Backup Files) • Support for “Core MapReduce” as well as the wider Hadoop ecosystem • Pig • Streaming Tuesday, October 16, 12
  • 130. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB • Coming Soon: Read/Write “archived BSON” (basically, MongoDB Backup Files) • Support for “Core MapReduce” as well as the wider Hadoop ecosystem • Pig • Streaming • Hive & Scoobi (coming soon) Tuesday, October 16, 12
  • 131. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10gen • Feed MongoDB data directly (“live”) into MapReduce jobs & save MapReduce results directly to MongoDB • Coming Soon: Read/Write “archived BSON” (basically, MongoDB Backup Files) • Support for “Core MapReduce” as well as the wider Hadoop ecosystem • Pig • Streaming • Hive & Scoobi (coming soon) • See http://api.mongodb.org/hadoop to learn more Tuesday, October 16, 12
  • 132. [Want to Know More About MongoDB?] Free Online Classes, Starting in October! http://education.10gen.com [Docs] http://mongodb.org http://api.mongodb.org/ *Contact Me* brendan@10gen.com (twitter: @rit) Tuesday, October 16, 12