Dev Jumpstart: Build Your First App with MongoDB

Post on 30-Jun-2015

549 views 0 download

description

New to MongoDB? This talk will introduce the philosophy and features of MongoDB. We’ll discuss the benefits of the document-based data model that MongoDB offers by walking through how one can build a simple app to store books. We’ll cover inserting, updating, and querying the database of books. This session will jumpstart your knowledge of MongoDB development, providing you with context for the rest of the day's content.

transcript

Developer Experience Team Lead, MongoDB

Christian Amor Kvalheim

#mongodb

Build your first app;an introduction to MongoDB

Christian Kvalheim• Team Lead MongoDB Drivers

• Node.js driver developer

• Been using MongoDB for 5 years

• Working at MongoDB last 3 years

What is MongoDB?

MongoDB is a ___________ database

• Document

• Open source

• High performance

• Horizontally scalable

• Full featured

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

Open Source

• MongoDB is an open source project

• On GitHub

• Licensed under the AGPL

• Started & sponsored by MongoDB Inc

• Commercial licenses available

• Contributions welcome

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 = agile development

Database Landscape

Full Featured

• Flexible schema

• Rich ad-hoc queries

• Real time aggregation

• Strongly consistent

• Geospatial features

• Built-in automatic failover

• Horizontally scalable reads/writes

• Support for most programming languages

mongodb.org/downloads

$ tar zxf mongodb-osx-x86_64-2.6.4.tgz

$ cd mongodb-osx-x86_64-2.6.4/bin

$ mkdir –p /data/db

$ ./mongod

Running MongoDB

$ mongoMongoDB shell version: 2.6.4connecting to: test> db.test.insert({text: 'Welcome to MongoDB'})> db.test.find().pretty(){

"_id" : ObjectId("51c34130fbd5d7261b4cdb55"),"text" : "Welcome to MongoDB"

}

Mongo Shell

Building an App with MongoDB

Terminology

RDBMS MongoDB

Table, View ➜ Collection

Row ➜ Document

Index ➜ Index

Join ➜ Embedded Document

Foreign Key ➜ Reference

Partition ➜ Shard

Let’s Build a Monitoring System

First step in any application is

Determine basic requirements

Basic Monitoring Requirements

• Data generated at per-second intervals

• Metrics to capture (ex. CPU, memory, IO)

• Document structure for fast writes and easy reads

In a relational base app

We would start by doing schema design

Relational Schema Options

CPU Metrics

Memory Metrics

IO Metrics

Events

• Timestamp• CPU metrics• Memory metrics• IO metrics

Or

In a MongoDB based appWe start with a generic modeland let the documents evolve

MongoDB Document Modeling

Events

CPU []• Second• Metric

Memory []• Second• Metric

IO []• Second• Metric

Timestamp (min)

Working With MongoDB

$ mongo

MongoDB shell version: 2.6.4

connecting to: test

>

Start with the Mongo Shell

Full Javascript shell

> use monitoring

switching to db monitoring

Switch to Your DB

DB files are created once you save a document

> var event = {

ts: ISODate(“2014-09-16T09:00:00”),

cpu: [ 0, 0, …, 0 ],

memory: [ 0, 0, …, 0 ],

io: [ 0, 0, …, 0 ],

}

Create an Empty Event

Insert zeroed-out arrays to fill in later

> db.events.insert(event)

Insert the Event

No collection creation necessary

> db.events.findOne()

{

"_id" : ObjectId("50804d0bd94ccab2da652599"),

”ts" : ISODate(“2014-09-16T09:00:00”),

”cpu" : [ 0, 0, …, 0 ],

”memory" : [ 0, 0, …, 0 ],

“io” : [ 0, 0, …, 0 ]

}

Find One Record

How do you capture events?

Server

Server

Server

MongoDB

cpu

memory

io

interaction

interaction

interaction

> db.events.update( { ts: ISODate(“2014-09-16T09:00:00”) } { $set: { “cpu.0” : 50, “memory.0”: 1500, “io.0”: 10 } })

Adding a New Event

Use atomic in-place updates to add metric values

How do you plot charts?

> db.events.find({

ts: {

$gte: ISODate(“2014-09-16T09:00:00”),

$lt: ISODate(“2014-09-16T10:00:00”)

}

}).sort({ts:1})

Finding an Hour of Events

Find using a range and sort results ascending

How do you roll up the data?

Hour Avg Cpu

0 50

1 65

2 75

3 40

4 45

5 60

6 25

… …

23 30

> db.events.aggregate([

{ $match: { ts: { $gte: date0, $lt: date1 } } },

{ $project: { _id: 0, ts: 1, cpu: 1 } },

{ $unwind: “$cpu” },

{ $group: {

_id: { $hour: “$ts” },

avg_cpu: { $avg: “$cpu” } } }

])

Aggregate Metrics

Use Aggregation Framework to roll up data

How do you scale this workload

• Replica Sets– Add data redundancy– Automatic failover– Tunable durability, consistency

• Sharding– Scale reads and writes– Support dynamic data growth– Automatically partitions workload– Horizontally scalable

MongoDB Drivers

Real applications are not built in the shell

MongoDB has native bindings for over 12 languages

MongoDB Drivers

• Official Support for 12 languages

• Community drivers for tons more

• Drivers connect to MongoDB servers

• Drivers translate BSON into native types

• Shell is not a driver, but works like one in some ways

• Installed using typical means (npm, pecl, gem, pip)

docs.mongodb.org

Online Training at MongoDB University

Suggestions for Talks

• Talk to me at Meet the Experts– 11 am – 12 pm– 1 pm – 2 pm– Or catch me in the hallway

• MongoDB for the internet of things

• Socialite the Open Source Status Feed

• The Future of MongoDB Storage

Questions?

Developer Experience Team Lead, MongoDB

Christian Amor Kvalheim

#mongodb

Thank You