71
Technical Evangelist, MongoDB @tgrall Tugdual Grall @EspritJUG Building your first app; an introduction to MongoDB

Building Your First MongoDB Application

  • View
    576

  • Download
    2

Embed Size (px)

DESCRIPTION

Introduction presentation delivered at ESPRIT JUG Day, Tunis 2014

Citation preview

Page 1: Building Your First MongoDB Application

Technical Evangelist, MongoDB@tgrall

Tugdual Grall

@EspritJUG

Building your first app;an introduction to MongoDB

Page 2: Building Your First MongoDB Application

@[email protected]

MongoDB@ESPRITJUG2014

• Day 1 : Introduction

• Discover MongoDB

• Day 2 : Deep Dive into Queries and Analytics

• Advanced CRUD operations

• Aggregation, GeoSpatial, Full Text

• Day 2 : Fun with MongoDB and Javascript

• WebSockets

• Node.js, AngularJS

Page 3: Building Your First MongoDB Application

@[email protected]

{ “about” : “me” }Tugdual “Tug” Grall • MongoDB

• Technical Evangelist

• Couchbase

• Technical Evangelist

• eXo

• CTO

• Oracle

• Developer/Product Manager

• Mainly Java/SOA

• Developer in consulting firms

• Web

• @tgrall

• http://blog.grallandco.com

• tgrall

• NantesJUG co-founder

• Pet Project :

• http://www.resultri.com

[email protected]

[email protected]

Page 4: Building Your First MongoDB Application

What is MongoDB?

Page 5: Building Your First MongoDB Application

@[email protected]

MongoDB is a ___________ database

• Document

• Open source

• High performance

• Horizontally scalable

• Full featured

Page 6: Building Your First MongoDB Application

@[email protected]

Document Database

• Not for .PDF & .DOC files

• A document is essentially an associative array

• Document = JSON object

• Document = PHP Array

• Document = Python Dict

• Document = Ruby Hash

• etc

Page 7: Building Your First MongoDB Application

@[email protected]

Document Database

Relational MongoDB{ first_name: ‘Paul’, surname: ‘Miller’ city: ‘London’, location: [45.123,47.232], cars: [ { model: ‘Bently’, year: 1973, value: 100000}, { model: ‘Rolls Royce’, year: 1965,! value: 330000}! } }

Page 8: Building Your First MongoDB Application

@[email protected]

Open Source

• MongoDB is an open source project

• On GitHub

• Licensed under the AGPL

• Started & sponsored by 10gen

• Commercial licenses available

• Contributions welcome

Page 9: Building Your First MongoDB Application

@[email protected]

High Performance

• Written in C++

• Extensive use of memory-mapped files i.e. read-through write-through memory caching.

• Runs nearly everywhere

• Data serialized as BSON (fast parsing)

• Full support for primary & secondary indexes

• Document model = less work

Page 11: Building Your First MongoDB Application

@[email protected]

Database Landscape

Page 12: Building Your First MongoDB Application

@[email protected]

Full Featured

• Ad Hoc queries

• Real time aggregation

• Rich query capabilities

• Strongly consistent

• Geospatial features

• Support for most programming languages

• Flexible schema

Page 13: Building Your First MongoDB Application

@[email protected]

Full Featured

Queries• Find Paul’s cars • Find everybody in London with a car built

between 1970 and 1980

Geospatial • Find all of the car owners within 5km of Trafalgar Sq.

Aggregation • Calculate the average value of Paul’s car collection

Map Reduce• What is the ownership pattern of colors

by geography over time? (is purple trending up in China?)

{ first_name: ‘Paul’, surname: ‘Miller’, city: ‘London’, location: { ! type: “Point”, !coordinates : ! ! [-0.128, 51.507] ! },! cars: [ { model: ‘Bentley’, year: 1973, value: 100000, … }, { model: ‘Rolls Royce’, year: 1965, value: 330000, … } } }

Text Search • Find all the cars described as having leather seats

Page 14: Building Your First MongoDB Application

@[email protected]

mongodb.org/downloads

Page 15: Building Your First MongoDB Application

$ tar –z xvf mongodb-osx-x86_64-2.6.x.tgz!$ cd mongodb-osx-i386-2.6.0/bin!$ mkdir –p /data/db!$ ./mongod

Running MongoDB

Page 16: Building Your First MongoDB Application

MacBook-Air-:~ $ mongo!MongoDB shell version: 2.6.0!connecting to: test!> db.test.insert({text: 'Welcome to MongoDB'})!> db.test.find().pretty()!{!! "_id" : ObjectId("51c34130fbd5d7261b4cdb55"),!! "text" : "Welcome to MongoDB"!}

Mongo Shell

Page 17: Building Your First MongoDB Application

Document Database

Page 18: Building Your First MongoDB Application

@[email protected]

Terminology

RDBMS MongoDB

Table, View ➜ Collection

Row ➜ Document

Index ➜ Index

Join ➜ Embedded Document

Foreign Key ➜ Reference

Partition ➜ Shard

Page 19: Building Your First MongoDB Application

@[email protected]

Let’s Build a Blog

Page 20: Building Your First MongoDB Application

@[email protected]

First step in any application is

Determine your entities

Page 21: Building Your First MongoDB Application

@[email protected]

Entities in our Blogging System

• Users (post authors)

• Article

• Comments

• Tags

Page 22: Building Your First MongoDB Application

@[email protected]

In a relational base app

We would start by doing schema design

Page 23: Building Your First MongoDB Application

@[email protected]

Typical (relational) ERD

Page 24: Building Your First MongoDB Application

@[email protected]

In a MongoDB based appWe start building our appand let the schema evolve

Page 26: Building Your First MongoDB Application

Working With MongoDB

Page 28: Building Your First MongoDB Application

var user = { !! ! ! ! username: ’tgrall', !! ! ! ! first_name: ’Tugdual',!! ! ! ! last_name: ’Grall',!}

Start with an object (or array, hash, dict, etc)

Page 29: Building Your First MongoDB Application

>db!test!> use blog! switching to db blog !!> db.users.insert( user )

Switch to Your DB

Page 30: Building Your First MongoDB Application

> db.users.insert(user)

Insert the Record

No collection creation necessary

Page 31: Building Your First MongoDB Application

> db.users.findOne()!{!! "_id" : ObjectId("50804d0bd94ccab2da652599"),!! "username" : ”tgrall",!! "first_name" : ”Tugdual",!! "last_name" : ”Grall"!}

Find One Record

Page 32: Building Your First MongoDB Application

@[email protected]

_id

• _id is the primary key in MongoDB

• Automatically indexed

• Automatically created as an ObjectId if not provided

• Any unique immutable value could be used

Page 33: Building Your First MongoDB Application

@[email protected]

ObjectId

• ObjectId is a special 12 byte value

• Guaranteed to be unique across your cluster

• ObjectId("50804d0bd94ccab2da652599") |----ts-----||---mac---||-pid-||----inc-----| 4 3 2 3

Page 34: Building Your First MongoDB Application

> db.article.insert({ !! ! ! ! ! title: ‘Hello World’,!! ! ! ! ! body: ‘This is my first blog post’,!! ! ! ! ! date: new Date(‘2013-06-20’),!! ! ! ! ! username: ‘tgrall’,!! ! ! ! ! tags: [‘adventure’, ‘mongodb’],!! ! ! ! ! comments: [ ]!})

Creating a Blog Post

Page 35: Building Your First MongoDB Application

> db.article.find().pretty()!{!! "_id" : ObjectId("51c3bafafbd5d7261b4cdb5a"),!! "title" : "Hello World",!! "body" : "This is my first blog post",!! "date" : ISODate("2013-06-20T00:00:00Z"),!! "username" : "tgrall",!! "tags" : [!! ! "adventure",!! ! "mongodb"!! ],!! "comments" : [ ]!}

Finding the Post

Page 36: Building Your First MongoDB Application

> db.article.find({tags:'adventure'}).pretty()!{!! "_id" : ObjectId("51c3bcddfbd5d7261b4cdb5b"),!! "title" : "Hello World",!! "body" : "This is my first blog post",!! "date" : ISODate("2013-06-20T00:00:00Z"),!! "username" : "tgrall",!! "tags" : [!! ! "adventure",!! ! "mongodb"!! ],!! "comments" : [ ]!}

Querying An Array

Page 37: Building Your First MongoDB Application

> db.article.update({_id: !

! new ObjectId("51c3bcddfbd5d7261b4cdb5b")}, !

! {$push:{comments:!

! {name: 'Steve Blank', comment: 'Awesome Post'}}})!

>

Using Update to Add a Comment

Page 38: Building Your First MongoDB Application

> db.article.findOne({_id: new ObjectId("51c3bcddfbd5d7261b4cdb5b")})!{!! "_id" : ObjectId("51c3bcddfbd5d7261b4cdb5b"),!! "body" : "This is my first blog post",!! "comments" : [!! ! {!! ! ! "name" : "Steve Blank",!! ! ! "comment" : "Awesome Post"!! ! }!! ],!! "date" : ISODate("2013-06-20T00:00:00Z"),!! "tags" : [!! ! "adventure",!! ! "mongodb"!! ],!! "title" : "Hello World",!! "username" : "tgrall"!}

Post with Comment Attached

Page 39: Building Your First MongoDB Application

@[email protected]

Real applications are not built in the shell

Page 40: Building Your First MongoDB Application

MongoDB Drivers

Page 41: Building Your First MongoDB Application

@[email protected]

MongoDB has native bindings for over 12 languages

Page 44: Building Your First MongoDB Application

@[email protected]

Hey, we are at a JUG no?

Page 45: Building Your First MongoDB Application

@[email protected]

Java & MongoDB

• Java Driver

• Morphia

• Spring Data MongoDB

• Hibernate OGM

• Jongo

Page 46: Building Your First MongoDB Application

@[email protected]

MongoDB Drivers (Java)

• Manage Connections to MongoDB Cluster

• Send commands over the wire

• Serialize/Deserialize Java Objects to BSON

• Generate Object ID

Page 47: Building Your First MongoDB Application

MongoClient mongoClient = new MongoClient("localhost", 27017);! DB db = mongoClient.getDB("ecommerce");! DBCollection collection = db.getCollection("orders");! DBObject order;! List<DBObject> items = new ArrayList<DBObject>();! DBObject item;!! order = BasicDBObjectBuilder.start()! .add("customer", "Tug Grall")! .add("date", new Date())! .get();! item = BasicDBObjectBuilder.start()! .add("label", "MongoDB in Action")! .add("price", 13.30)! .add("qty", 1)! .get();! items.add(item);!! order.put("items", items);!! collection.insert(order);

Java Driver : Insert

Page 48: Building Your First MongoDB Application

MongoClient mongoClient = new MongoClient("localhost", 27017);!! DB db = mongoClient.getDB("ecommerce");! DBCollection collection = db.getCollection("orders");!!! DBObject query = BasicDBObjectBuilder.start()! .push("items.price")! .add(QueryOperators.GTE , 20)! .get();!!! DBCursor cursor = collection.find( query );! while (cursor.hasNext()) {! System.out.println(cursor.next());! }

Java Driver : query

Page 49: Building Your First MongoDB Application

@[email protected]

Morphia

• Based on Java Driver

• Provide a simple mapping

• Query Builder

• https://github.com/mongodb/morphia

Page 50: Building Your First MongoDB Application

public class Order {!! @Id private ObjectId id;!! private Date date;!! @Property(“customer")!! private String customer;!! @Embedded!! List<Item> items;!! ...!}!!{!Mongo mongo = new Mongo();!Morphia morphia = new Morphia();!Datastore datastore = morphia.createDatastore(mongo, “ecommerce”); !!Order order = new Order();!…!Key<Order> savedOrder = datastore.save(order);!… !}

Morphia: Insert

Page 51: Building Your First MongoDB Application

! !!! List<Order> findByItemsQuantity(int quantity) {!! ! return !! ! find( createQuery().filter("items.quantity", quantity))!! ! .asList();!! }

Morphia : Query

Page 52: Building Your First MongoDB Application

@[email protected]

ORM

Object Relational Mapping

Page 53: Building Your First MongoDB Application

@[email protected]

ODM

Object Document Mapping

Page 54: Building Your First MongoDB Application

@[email protected]

Spring Data

• Part of the Spring ecosystem

• Common approach for many datasources

• RDBMS, NoSQL, Caching Layers

• Key Features

• Templating

• ODM

• Repository Support

• http://projects.spring.io/spring-data-mongodb/

Page 55: Building Your First MongoDB Application

public class Order {!! @Id private!! String id;!! private Date date;!! @Field(“customer")!! private String customer;!! List<Item> items; ...!}!

Spring Data: Insert

Page 56: Building Your First MongoDB Application

public interface OrderRepository !! extends MongoRepository<Order, String> {!!! List<Order> findByItemsQuantity(int quantity);!!! @Query("{ \"items.quantity\": ?0 }")!! List<Order> findWithQuery(int quantity);!!}

Spring Data : Query

Page 57: Building Your First MongoDB Application

@[email protected]

Jongo

• Based on Java Driver

• Document Mapping

• Easy Query

• MongoDB Shell “experience” for Java

• http://jongo.org/

Page 58: Building Your First MongoDB Application

public class Order {!! @Id private!! String id;!! private Date date;!! @Field(“customer")!! private String customerInfo;!! List<Item> items; ...!}!!{!MongoClient mongoClient = new MongoClient();!DB db = mongoClient.getDB("ecommerce");!Jongo jongo = new Jongo(db);!MongoCollection orders = jongo.getCollection("orders");!!Order order = new Order()!...!orders.save( order );!}

Jongo: Insert

Page 59: Building Your First MongoDB Application

!{!!DB db = mongoClient.getDB("ecommerce");!Jongo jongo = new Jongo(db);!MongoCollection orders = jongo.getCollection("orders");!!Iterable<Order> result = orders!! .find("{\"items.quantity\": #}", 2)!! .fields( “{ _id :0, date : 1, customer : 1 }” );!! .as(Order.class);!!}

Jongo: Query

Page 60: Building Your First MongoDB Application

@[email protected]

Hibernate OGM

• OGM : Object Grid Mapper

• The “JPA” way

• Subset of JPA

• Query not yet well supported

• Still under development

• http://hibernate.org/ogm

Page 61: Building Your First MongoDB Application

public class Order {!! @GeneratedValue(generator = "uuid")!! @GenericGenerator(name = "uuid", strategy = "uuid2")!! @Id private!! String id;!! private Date date;!! @Column(name = “customer")!! private String customer;!! @ElementCollection!! private List<Item> items;!…!}

Hibernate OGM: Insert

Page 62: Building Your First MongoDB Application

{!… !!@PersistenceContext(unitName = "ecommerce-mongodb-ogm")!EntityManager em;!!Order order = new Order();!…!!em.persist(quote);!!}

Hibernate OGM: Insert

Page 63: Building Your First MongoDB Application

@[email protected]

Which one is good for me?

Page 64: Building Your First MongoDB Application

@[email protected]

MongoDB Java Driver

Morphia Spring Data Jongo Hibernate OGM

Page 65: Building Your First MongoDB Application

@[email protected]

MongoDB Java Driver

Morphia Spring Data Jongo Hibernate OGM

• Developed and Supported by MongoDB Inc • The most used way to use MongoDB & Java • Support “ all database features” • Too Verbose… (IMHO)

• new version is coming 3.0

Page 66: Building Your First MongoDB Application

@[email protected]

MongoDB Java Driver

Morphia Spring Data Jongo Hibernate OGM

• Developed and Supported by MongoDB Inc • Easy Mapping and Query • Active Community

Page 67: Building Your First MongoDB Application

@[email protected]

MongoDB Java Driver

Morphia Spring Data Jongo Hibernate OGM

• Developed and Supported by Spring • Easy Mapping and Query • Advanced Features • Great for Spring developers!

Page 68: Building Your First MongoDB Application

@[email protected]

MongoDB Java Driver

Morphia Spring Data Jongo Hibernate OGM

• Developed by the Community • Easy query and mapping • Mature • A better tools for MongoDB query language fans!

Page 69: Building Your First MongoDB Application

@[email protected]

MongoDB Java Driver

Morphia Spring Data Jongo Hibernate OGM

• Developed by Red Hat - Jboss • Not yet supported • Under development (not mature, not for production!) • Too “relational”

• nice to learn… but move away from it asap :)

Page 70: Building Your First MongoDB Application

Questions?

Page 71: Building Your First MongoDB Application

#ConferenceHashtag

Thank You