• Save
Mongo DB on the JVM - Brendan McAdams
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Mongo DB on the JVM - Brendan McAdams

  • 2,571 views
Uploaded on

Brendan McAdams explores the deeper relationship between the MongoDB database and various languages on the Java Virtual Machine such as Java, Scala, Clojure, JRuby and Python as well as the......

Brendan McAdams explores the deeper relationship between the MongoDB database and various languages on the Java Virtual Machine such as Java, Scala, Clojure, JRuby and Python as well as the challenges posted getting MongoDB to play nice with these tools and their syntax. Also examined will be frameworks and integration points popular between MongoDB and the JVM such as Spring Data, Morphia and Lift’s MongoDB-Record component

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,571
On Slideshare
2,561
From Embeds
10
Number of Embeds
2

Actions

Shares
Downloads
0
Comments
0
Likes
4

Embeds 10

http://lanyrd.com 9
https://twitter.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. MongoDB + the JVM Integrating NoSQL with the JVM Brendan McAdams 10gen, Inc. brendan@10gen.com @ritTuesday, 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 codeTuesday, October 16, 12
  • 6. MongoDB as a DatabaseTuesday, October 16, 12
  • 7. MongoDB as a Database • MongoDB is designed to fit your applicationTuesday, October 16, 12
  • 8. MongoDB as a Database • MongoDB is designed to fit your application • FlexibleTuesday, October 16, 12
  • 9. MongoDB as a Database • MongoDB is designed to fit your application • Flexible • FastTuesday, October 16, 12
  • 10. MongoDB as a Database • MongoDB is designed to fit your application • Flexible • Fast • SaneTuesday, October 16, 12
  • 11. MongoDB as a DatabaseTuesday, October 16, 12
  • 12. MongoDB as a Database • Two crucial core conceptsTuesday, October 16, 12
  • 13. MongoDB as a Database • Two crucial core concepts • Document Oriented DataTuesday, October 16, 12
  • 14. MongoDB as a Database • Two crucial core concepts • Document Oriented Data • ScalabilityTuesday, October 16, 12
  • 15. MongoDB as a DatabaseTuesday, October 16, 12
  • 16. MongoDB as a Database • Document Oriented DataTuesday, 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 valuesTuesday, 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 DataTuesday, 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 DataTuesday, 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
  • 25. Querying with MongoDBTuesday, October 16, 12
  • 26. Querying with MongoDB • Querying in MongoDB is similar to a ‘query by example’ interfaceTuesday, October 16, 12
  • 27. Querying with MongoDB • Querying in MongoDB is similar to a ‘query by example’ interfaceTuesday, 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 statementsTuesday, 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 arrayTuesday, 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 DatabaseTuesday, October 16, 12
  • 39. MongoDB as a Database • ScalabilityTuesday, October 16, 12
  • 40. MongoDB as a Database • Scalability • Database should grow and scale with our applicationTuesday, 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 failoverTuesday, 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 managementTuesday, October 16, 12
  • 43. MongoDB on the JVMTuesday, October 16, 12
  • 44. MongoDB on the JVM • MongoDB has strong, wide support on the JVMTuesday, October 16, 12
  • 45. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • JavaTuesday, October 16, 12
  • 46. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • Java • ScalaTuesday, October 16, 12
  • 47. MongoDB on the JVM • MongoDB has strong, wide support on the JVM • Java • Scala • HadoopTuesday, 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 + JavaTuesday, October 16, 12
  • 50. MongoDB + Java • Java + MongoDBTuesday, 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 structuresTuesday, 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) • MorphiaTuesday, 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 annotationsTuesday, 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 DataTuesday, 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 MongoDBTuesday, 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 todayTuesday, October 16, 12
  • 59. Core MongoDB + JavaTuesday, 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 + JavaTuesday, 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 + JavaTuesday, 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 MorphiaTuesday, 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 MorphiaTuesday, 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 + ScalaTuesday, October 16, 12
  • 77. MongoDB + Scala • Scala + MongoDBTuesday, 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 APITuesday, 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 CanBuildFromTuesday, 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 •ODMsTuesday, 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 lightweightTuesday, 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 patternTuesday, 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 basedTuesday, 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 promisingTuesday, October 16, 12
  • 87. Basic MongoDB + Scala via CasbahTuesday, 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 CasbahTuesday, 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.resultTuesday, 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 CasbahTuesday, 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 CasbahTuesday, 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 LiftTuesday, 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 LiftTuesday, 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 LiftTuesday, 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/rogueTuesday, October 16, 12
  • 107. Object Mapping in Scala via LiftTuesday, 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 SalatTuesday, 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 SalatTuesday, 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 simpleTuesday, October 16, 12
  • 114. MongoDB + ClojureTuesday, October 16, 12
  • 115. MongoDB + Clojure • Clojure + MongoDBTuesday, 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 APITuesday, October 16, 12
  • 118. MongoDB + Clojure • Clojure + MongoDB • “Core” MongoDB Driver (monger) • Fairly new, similarities to Casbah, including a “native” Query API • Not officially supportedTuesday, 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 MongerTuesday, 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 + HadoopTuesday, October 16, 12
  • 123. MongoDB + Hadoop • Hadoop + MongoDBTuesday, October 16, 12
  • 124. MongoDB + Hadoop • Hadoop + MongoDB • Hadoop integration with MongoDB is one of my key projects at 10genTuesday, 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 MongoDBTuesday, 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 ecosystemTuesday, 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 • PigTuesday, 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 • StreamingTuesday, 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 moreTuesday, 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