36
Application Development Series Back to Basics Interaction avec la base de données Tugdual Grall @tgrall #MongoDBBasics

2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

  • Upload
    mongodb

  • View
    813

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Application Development SeriesBack to BasicsInteraction avec la base de données

Tugdual Grall@tgrall

#MongoDBBasics

Page 2: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

2

• Session Précédente : Rappel

• MongoDB Inserts & Queries– ObjectId– Récupération des Documents & Cursors– Projections

• MongoDB Update– Fixed Buckets– Pre Aggregated Reports

• Write Concern– Compromis : Durabilité / Performance

Agenda

Page 3: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

3

• Virtual Genius Bar

– Utilisez la fenêtre de chat

Q & A

Page 4: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Recap from last time….

Page 5: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

5

• Architecture de l’Application– JSON / RESTful– Basé sur Python

Architecture

Client-sideJSON

(eg AngularJS) (BSON)

Pymongo driver

Python web app

HTTP(S) REST

Page 6: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

6

• Design• Articles• Comments• Interactions• Users

Schema & Architecture

Page 7: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

7

Modèle : Articles

• Creation d’articles• Insert

• Liste d’articles• Renvois d’un Curseur

• Article Unique

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

'text': 'Article content…',

'date' : ISODate(...),

'title' : ’Intro to MongoDB',

'author' : 'Dan Roberts',

'tags' : ['mongodb',

'database',

'nosql’]

}

Collection : Articles

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

Page 8: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

8

Modèle : Comments

• Stockage des commentaires

• Récupération des commentaires

• Ajout nouveau commentaire au 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’ }, …}

Collection : Comments

METHODESdef add_comment(article_id):def get_comments(article_id):

Page 9: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

9

Modèle : Interactions

• Reporting

• Used for reporting on articles

• Création de rapports “pre-aggregé”

{‘_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 } }}

Collection : Interactions

METHODES def add_interaction(article_id, type):

Page 10: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Création / Requêtes

Page 11: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

11

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

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

'database', 'nosql’

]});

• Driver génère ObjectId() pour le _id – Si non spécifié par l’application– 12 octets- 4-octets epoch, 3-octets machine id, a 2-octets process id, 3-octets

counter.

Ajout de documents

Page 12: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

12

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

• Utilisé pour requêter la base de données

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

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

Opérateurs: Comparaison

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’] } } );

Page 13: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

13

• Find retourne un curseur– Utilisé pour naviguer dans le résultat– Un curseur a plusieurs méthodes

Curseurs

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

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

}

Page 14: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

14

• Retourne uniquement certains attributs– Booléen 0/1 pour sélectionner les attributs– Plus efficace

Projections

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

Page 15: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Mises à jour

Page 16: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

16

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

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

$each, $slice, $sort

Opérateur : Update

>db.articles.update(

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

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

article!’ }}

)

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

'title' : ’Intro to MongoDB’,

'author' : ’Tug Grall’,'tags' : ['mongodb',

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

[‘Great article!’ ]

}

Page 17: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

17

Ajout d’élément à un tableau

$push, $each, $slice

Opérateur : Update

>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’ ]

}

Page 18: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

18

• Ajout de commentaires dans un document (max : 10 - bucket).

• Création d’un nouveau.

• Utilisation de {upsert: true} .

Opérateur : Update- 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’ ]

}

Page 19: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

19

Analytique– Pre-Agrégation

• Reporting

• Rapports Pré-agregés

{‘_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 } }}

Collections : Interactions

METHODE def add_interaction(article_id, type):

Page 20: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

20

• Utilisation de $inc pour incrémenter plusieurs compteurs.

• Opération atomique

• Incrémentation des compteurs par jour et heure

Compteurs : Incrément

>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 } }}

Page 21: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

21

• Création de nouveaux compteurs

Compteurs : Incrément (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}

}

Page 22: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

22

• Increment new counters

Compteurs : Incrément (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

}}

Page 23: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Durabilité

Page 24: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

24

Durabilité

• Avec MongoDB, plusieurs options• Memoire/RAM• Disque (primaire)• Plusieurs serveur (replicats)

• Write Concerns• Retour sur le status de l’opération d’écriture• getLastError() appelé par le driver

• Compromis• Latence

Page 25: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

25

Unacknowledged

Page 26: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

26

MongoDB Acknowledged

Default Write Concern

Page 27: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

27

Wait for Journal Sync

Page 28: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

28

Replica Sets

• Replica Set – 2 copies ou plus

• Tolérant aux pannes

• Répond à plusieurs contraintes:

- High Availability

- Disaster Recovery

- Maintenance

Page 29: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

29

Wait for Replication

Page 30: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Résumé

Page 31: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

31

• Interactions

– Requtes et projections– Inserts & Upserts

– Opérateurs : Update– Bucketing– Rapports pre-agrégés

• Base pour les rapport analytiques

Résumé

Page 32: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

32

– Indexation• Stratégies/Options• Optimisation

– Text Search

– Geo Spatial

– Query Profiler

Prochaine Session – 9 Avril

Page 33: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev
Page 34: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Tweet vos questions à

#mongoDBBasics

Page 35: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev

Risorsa WEBSITE

URL

Enterprise Download

mongodb.com/download

Training Online Gratuito

education.mongodb.com

Webinars e Events

mongodb.com/events

White Paper

mongodb.com/white-papers

Casi d’Uso

mongodb.com/customers

Presentazioni

mongodb.com/presentations

Documentazione

docs.mongodb.org

Page 36: 2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev