Webinar: Build an Application Series - Session 3 - Interacting with the database

Post on 09-May-2015

3.044 views 0 download

description

The third session in our eight-part webinar series on "Building an application with MongoDB" to learn best practices, tips and tricks from our Solution Architects and learn how easy it is to start building applications with MongoDB. This session - presented by Daniel Roberts, Solutions Architect at MongoDB - discusses queries and updates and the interaction between an application and a database. Next in the Series: March 6th 2014 - Build an Application Series - Session 4 - Indexing This session will focus on indexing strategies for the application, including geo spatial and full text search March 20th 2014 - Build an Application Series - Session 5 - Reporting in your application This session covers Reporting and Aggregation Framework and Building application usage reports April 3th 2014 - Operations for your application - Session 6 - Deploying the application By this stage, we will have built the application. Now we need to deploy it. We will discuss architecture for High Availability and scale out April 17th 2014 - Operations for your application - Session 7 - Backup and DR This webinar will discuss back up and restore options. Learn what you should do in the event of a failure and how to perform a backup and recovery of the data in your applications May 6th 2014 - Operations for your application - Session 8 - Monitoring and Performance Tuning The final webinar of the series will discuss what metrics are important and how to manage and monitor your application for key performance. Daniel Roberts: About the speaker Daniel Roberts is a Solutions Architect based in London. Prior to MongoDB Daniel worked at Oracle for 11 years in a number of different positions, including Oracle's middleware technologies and strategy. Prior roles include consulting, product management, business development and more recently as a solution architect for financial services. Daniel has also worked for Novell, ICL and as a freelance contractor. He has a degree in Computer Science from Nottingham Trent University in the UK.

Transcript of Webinar: Build an Application Series - Session 3 - Interacting with the database

Application Development SeriesBack to BasicsInteracting with the database

Daniel Roberts@dmroberts

#MongoDBBasics

2

• Recap from last session

• MongoDB Inserts & Queries– ObjectId– Returning documents – cursors– Projections

• MongoDB Update operators– Fixed Buckets– Pre Aggregated Reports

• Write Concern– Durability vs Performance trade off

Agenda

3

• Virtual Genius Bar

– Use the chat to post questions

– EMEA Solution Architecture / Support team are on hand

– Make use of them during the sessions!!!

Q & A

Recap from last time….

5

• Looked at the application architecture– JSON / RESTful– Python based

Architecture

Client-sideJSON

(eg AngularJS) (BSON)

Pymongo driver

Python web app

HTTP(S) REST

6

• Schema design– Modeled

• Articles• Comments• Interactions• Users

Schema and Architecture

7

Modeling Articles

• Posting articles• insert

• Get List of articles• Return Cursor

• Get individual article

{ '_id' : ObjectId(...),

'text': 'Article content…',

'date' : ISODate(...),

'title' : ’Intro to MongoDB',

'author' : 'Dan Roberts',

'tags' : ['mongodb',

'database',

'nosql’]

}

Articles collection

METHODSdef get_article(article_id)def get_articles():def create_article():

8

Modeling Comments

• Storing comments

• Quickly retrieve most recent comments

• Add new comments to document

• ‘Bucketing’

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘page’ : 1, ‘count’ : 42 ‘comments’ : [

{ ‘text’ : ‘A great article, helped me understand schema design’, ‘date’ : ISODate(..), ‘author’ : ‘johnsmith’ }, …}

Comments collection

METHODSdef add_comment(article_id):def get_comments(article_id):

9

Modeling Interactions

• Used for reporting on articles

• Create “pre-aggregated” reports

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘section’ : ‘schema’,

‘date’ : ISODate(..),‘daily’: { ‘views’ : 45,

‘comments’ : 150 } ‘hours’ : { 0 : { ‘views’ : 10 }, 1 : { ‘views’ : 2 }, … 23 : { ‘views’ : 14,

‘comments’ : 10 } }}

Interactions collection

METHODS def add_interaction(article_id, type):

Inserting / Querying

11

>db.articles.insert({'text': 'Article content…’,

'date' : ISODate(...), 'title' : ’Intro to MongoDB’, 'author' : 'Dan Roberts’, 'tags' : [ 'mongodb',

'database', 'nosql’

]});

• Driver generates ObjectId() for _id – if not specified– 12 bytes - 4-byte epoch, 3-byte machine id, a 2-byte process id, and a 3-byte

counter.

Inserting documents

12

$gt, $gte, $in, $lt, $lte, $ne, $nin

• Use to query documents

• Logical: $or, $and, $not, $nor Element: $exists, $type

• Evaluation: $mod, $regex, $where Geospatial: $geoWithin, $geoIntersects, $near, $nearSphere

Comparison Operators

db.articles.find( { 'title' : ’Intro to MongoDB’ } )

db.articles.find( { ’date' : { ‘$lt’ : {ISODate("2014-02-

19T00:00:00.000Z") }} )

db.articles.find( { ‘tags’ : { ‘$in’ : [‘nosql’, ‘database’] } } );

13

• Find returns a cursor– Use to iterate over the results– cursor has many methods

Cursors

>var cursor = db.articles.find ( { ’author' : ’Dan Roberts’ } )>cursor.hasNext()true>cursor.next(){ '_id' : ObjectId(...),

'text': 'Article content…’, 'date' : ISODate(...), 'title' : ’Intro to MongoDB’, 'author' : 'Dan Roberts’, 'tags' : [ 'mongodb', 'database’, 'nosql’ ]

}

14

• Return only the attributes needed– Boolean 0 or 1 syntax select attributes– Improved efficiency

Projections

>var cursor = db.articles.find( { ’author' : ’Dan Roberts’ } , {‘_id’:0, ‘title’:1})>cursor.hasNext()true>cursor.next(){ "title" : "Intro to MongoDB" }

Updates

16

$each, $slice, $sort, $inc, $push$inc, $rename, $setOnInsert, $set, $unset, $max, $min

$, $addToSet, $pop, $pullAll, $pull, $pushAll, $push

$each, $slice, $sort

Update Operators

>db.articles.update(

{ '_id' : ObjectId(...)},

{ '$push' : {'comments' : ‘Great

article!’ }}

)

{ 'text': 'Article content…’ 'date' : ISODate(...),

'title' : ’Intro to MongoDB’,

'author' : 'Dan Roberts’,'tags' : ['mongodb',

'database’,'nosql’ ],’comments' :

[‘Great article!’ ]

}

17

Push to a fixed size array with…

$push, $each, $slice

Update Operators

>db.articles.update(

{ '_id' : ObjectId(...)},

{ '$push' : {'comments' :

{

'$each' : [‘Excellent’], '$slice' : -3}}, })

{ 'text': 'Article content…’ 'date' : ISODate(...),

'title' : ’Intro to MongoDB’,

'author' : 'Dan Roberts’,'tags' : ['mongodb',

'database’,'nosql’ ],’comments' :

[‘Great article!’, ‘More please’, ‘Excellent’ ]

}

18

• Push 10 comments to a document (bucket).

• Automatically create a new document.

• Use {upsert: true} instead of insert.

Update Operators - Bucketing

>db.comments.update(

{‘c’: {‘$lt’:10}}, {

‘$inc’ : {c:1}, '$push' : {

'comments' : ‘Excellent’}},{ upsert : true }

)

{‘_id’ : ObjectId( … )‘c’ : 3,’comments' :

[‘Great article!’,

‘More please’, ‘Excellent’ ]

}

19

Analytics – Pre-Aggregated reports

• Used for reporting on articles

• Create “pre-aggregated” reports

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘section’ : ‘schema’,

‘date’ : ISODate(..),‘daily’: { ‘views’ : 45,

‘comments’ : 150 } ‘hours’ : { 0 : { ‘views’ : 10 }, 1 : { ‘views’ : 2 }, … 23 : { ‘views’ : 14,

‘comments’ : 10 } }}

Interactions collections

METHOD def add_interaction(article_id, type):

20

• Use $inc to increment multiple counters.

• Single Atomic operation.

• Increment daily and hourly counters.

Incrementing Counters

>db.interactions.update({‘article_id’ : ObjectId(..)}, {

‘$inc’ : {

‘daily.views’:1,

‘daily.comments’:1

‘hours.8.views’:1

‘hours.8.comments’:1 })

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘section’ : ‘schema’,

‘date’ : ISODate(..),‘daily’: { ‘views’ : 45,

‘comments’ : 150 } ‘hours’ : { 0 : { ‘views’ : 10 }, 1 : { ‘views’ : 2 }, … 23 : { ‘views’ : 14,

‘comments’ : 10 } }}

21

• Increment new counters

Incrementing Counters 2

>db.interactions.update({‘article_id’ : ObjectId(..)}, {

‘$inc’ : {

‘daily.views’:1,

‘daily.comments’:1,

‘hours.8.views’:1,

‘hours.8.comments’:1,

‘referrers.bing’ : 1})

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘section’ : ‘schema’,

‘date’ : ISODate(..),‘daily’: { ‘views’ : 45,

‘comments’ : 150 } ‘hours’ : {

…..}‘referrers’ : {

‘google’ : 27}

}

22

• Increment new counters

Incrementing Counters 2

>db.interactions.update({‘article_id’ : ObjectId(..)}, {

‘$inc’ : {

‘daily.views’:1,

‘daily.comments’:1,

‘hours.8.views’:1,

‘hours.8.comments’:1,

‘referrers.bing’ : 1})

{‘_id’ : ObjectId(..),

‘article_id’ : ObjectId(..), ‘section’ : ‘schema’,

‘date’ : ISODate(..),‘daily’: { ‘views’ : 45,

‘comments’ : 150 } ‘hours’ : {

…..}‘referrers’ : {

‘google’ : 27,‘bing’ : 1

}}

Durability

24

Durability

• With MongoDB you get to choose• In memory• On disk• Multiple servers

• Write Concerns• Report on success of write operations• getLastError called from driver

• Trade off• Latency of response

25

Unacknowledged

26

MongoDB Acknowledged

Default Write Concern

27

Wait for Journal Sync

28

Replica Sets

• Replica Set – two or more copies

• “Self-healing” shard

• Addresses many concerns:

- High Availability

- Disaster Recovery

- Maintenance

29

Wait for Replication

Summary

31

• Interacting with the database

– Queries and projections– Inserts and Upserts

– Update Operators– Bucketing– Pre Aggregated reports

• basis for fast analytics

Summary

32

– Indexing• Indexing strategies• Tuning Queries

– Text Search

– Geo Spatial

– Query Profiler

Next Session – 6th March