際際滷

際際滷Share a Scribd company logo
Introduction to NoSQL db and mongoDB
BIO
Senior SW Engineer
@RAI Radiotelevisione italiana
Rome, Italy

QUIT IT APP
@quititapp

GET IN TOUCH!
roberto.belardo@gmail.com	
 
	
 
@robertobelardo	
 
	
 
robertobelardo.wordpress.com	
 
	
 
Skype:	
 backslash451
Traditional RDBMS
ACID (atomicity, Consistency, Isolation, Durability)
Great for relation data
widely adopted and well understood
TRANSACTIONS
JOINS
but
≒
≒
≒
≒

joins are slow
do not scale easily
SQL is a pain in the ass -> ORM
SCHema are not flexible
- and -
NOSQL DB
ONLY

≒
≒
≒
≒

ACID-LESS (NOT ALWAYS SWEET)
Elastic scaling
Big data
Flexible data models

KEY/VALUE STORES
memcached db
project voldemort
redis
dynamo

DOCUMENT DB
mongo db
couch base

GRAPH STORES
neo4j
orient db
allegro
virtuoso

wide column stores
big table
hbase
accumulo
cassandra
Introduction to NoSQL db and mongoDB
mongo features
≒
≒
≒
≒
≒

Schema-less
bson document (binary json)
full index support
replication and high availability
Easy to use
Jargon
RDBMS	
 

mongoDB	
 

Table	
 

Collec=on	
 

Row(s)	
 

(JSON)	
 Document	
 

Column	
 

Field	
 

Index	
 

Index	
 

Join	
 

Embedding	
 &	
 Linking	
 

Par==on	
 

Shard	
 

GROUP	
 BY	
 

Aggrega=on
Data SNIPPET
{_id: !ObjectId(4dfa6baa9c65dae09a4bbda5),!
title: Programming in Scala,!
author: [!
!{!
! !first_name:
! !Martin,!
! !last_name: ! !Odersky,!
! !nationality: !DE,!
! !year_of_birth:
!1958!
!},!
!{!
! !first_name:
! !Lex,!
! !last_name: ! !Spoon!
!},!
!{!
! !first_name:
! !Bill,!
! !last_name: ! !Venners!
!}!
]}!
CRUD querying
INSERT	
 a	
 document	
 in	
 a	
 collec7on	
 
> db.foo.insert({name:Sauron, type:bad-ass, address:Mordor, eyes:1})!

SELECT	
 all	
 documents	
 in	
 a	
 collec7on	
 
> db.foo.find()!

SELECT	
 some	
 documents	
 in	
 a	
 collec7on	
 
> db.foo.find({eyes:1})
> db.foo.find({eyes:1, type:bad-ass})!

UPDATE	
 a	
 document	
 in	
 a	
 collec7on	
 
> db.foo.save({_id:10, name:Sauron, type:good boy})!
> db.foo.update({type:bad-ass},{$inc:{eyes:1}},{multi:true})!

DELETE	
 all	
 documents	
 in	
 a	
 collec7on	
 
> db.foo.remove()!

DELETE	
 some	
 documents	
 in	
 a	
 collec7on	
 
> db.foo.remove({eyes:1})!
Advanced
STUFF
WRITE CONCERNS

Speci鍖es	
 where	
 a	
 write	
 (insert)	
 opera3on	
 has	
 succeeded.	
 
In	
 some	
 failure	
 cases,	
 write	
 opera3ons	
 issued	
 with	
 weak	
 write	
 concerns	
 may	
 not	
 persist.	
 

weak concern fast writes

With	
 stronger	
 write	
 concerns,	
 clients	
 wait	
 aAer	
 sending	
 a	
 write	
 opera3on	
 for	
 MongoDB	
 to	
 
con鍖rm	
 the	
 write	
 opera3on.	
 

errors ignored w:-1

It	
 does	
 not	
 acknowledge	
 write	
 op.	
 and	
 the	
 client	
 cannot	
 detect	
 failed	
 write	
 op.	
 

unacknowledged w:0

It	
 does	
 not	
 acknowledge	
 write	
 op.	
 but	
 driver	
 aUempt	
 to	
 handle	
 network	
 errors.	
 

acknowledged w:1

It	
 con鍖rms	
 the	
 receipt	
 of	
 the	
 write	
 op.	
 allowing	
 clients	
 to	
 catch	
 errors.	
 

journaled w:1,j:true

It	
 con鍖rms	
 the	
 receipt	
 of	
 the	
 write	
 op.	
 only	
 aWer	
 commiXng	
 the	
 data	
 to	
 journal.	
 

replica acknowledged w:n (n>1)

It	
 con鍖rms	
 the	
 receipt	
 of	
 the	
 write	
 op.	
 	
 aWer	
 acknowledging	
 primary	
 and	
 n-足1	
 secondaries.	
 

DEFAULT
INDEXES

Without	
 indexes,	
 mongoDB	
 must	
 scan	
 every	
 document	
 in	
 a	
 collec3on!	
 
index types

Default _ID
single field
compound index
multikey index
geospatial index
text indexes
hashed indexes
properties

unique indexes
sparse indexes

creating indexes
> db.foo.ensureIndex({phone-number:1}) !
!
> db.foo.ensureIndex({name:1, phone-number:1})!
!
> db.foo.ensureIndex({name:1}, {unique:true})!

> db.foo.ensureIndex({nickname:1}, {sparse:true})!
!
> db.foo.ensureIndex({a:1},{unique:true,sparse:true})!
REPLICAtion

Replica3on	
 provides	
 redundancy	
 and	
 increases	
 data	
 availability.	
 

Automatic failover: ELECTIONS
SHARDING
horizontal scaling the mongoway

SHARDimmutable
KEYs
shard key is

{

range based sharding
hash based sharding

. easily divisible among shards
. high degree of randomness
. targets a single shard
. compound shard key

> db.runCommand({ shardcollection:test.users, !
!
!
!
!
!key: { email:1}})!

split--ting
triggered automatically by a mongos if a chunk goes
beyond max size (default 64mb)

Balanc

ing

triggered automatically by a mongos if there is a chunk
imbalance (8+ chunks)
Aggre | gation

MaP
Reduce

framework

operators

. filter
. project
. unwind
. group
. sort
. limit

> db.article.aggregate(!
!{ $project: {author:1, tags: 1}},!
!{ $unwind: $tags},!
!{ $group: { !_id: $tags, !
!
!
!
!authors: { $addToSet: $author}}})!

{ result:
!{_id:
!{_id:
!{_id:
!{_id:
!],!
!ok:1!
}!

[!
art, authors:[bill, bob]},!
sports, authors:[jane, bob]},!
food, authors:[jane, bob]},!
science, authors:[jane, bob, bill]},!
still a lot to cover!
map reduce
geo spatial
GRID FS
drivers
etc.
resources
hBp://www.mongodb.org/	
 
hBp://www.mongodb.com/learn/nosql	
 
hBp://www.mongodb.org/about/introduc7on/	
 
hBp://try.mongodb.org/	
 
hBp://www.slideshare.net/spacemonkeylabs/data-足as-足documents-足overview-足and-足intro-足
to-足mongodb	
 
≒ hBps://speakerdeck.com/backslash451	
 
≒ hBps://educa7on.mongodb.com/	
 
≒ hBp://lmgQy.com/?q=mongoDB	
 
≒
≒
≒
≒
≒

More Related Content

Introduction to NoSQL db and mongoDB

  • 2. BIO Senior SW Engineer @RAI Radiotelevisione italiana Rome, Italy QUIT IT APP @quititapp GET IN TOUCH! roberto.belardo@gmail.com @robertobelardo robertobelardo.wordpress.com Skype: backslash451
  • 3. Traditional RDBMS ACID (atomicity, Consistency, Isolation, Durability) Great for relation data widely adopted and well understood TRANSACTIONS JOINS
  • 4. but ≒ ≒ ≒ ≒ joins are slow do not scale easily SQL is a pain in the ass -> ORM SCHema are not flexible - and -
  • 5. NOSQL DB ONLY ≒ ≒ ≒ ≒ ACID-LESS (NOT ALWAYS SWEET) Elastic scaling Big data Flexible data models KEY/VALUE STORES memcached db project voldemort redis dynamo DOCUMENT DB mongo db couch base GRAPH STORES neo4j orient db allegro virtuoso wide column stores big table hbase accumulo cassandra
  • 7. mongo features ≒ ≒ ≒ ≒ ≒ Schema-less bson document (binary json) full index support replication and high availability Easy to use
  • 8. Jargon RDBMS mongoDB Table Collec=on Row(s) (JSON) Document Column Field Index Index Join Embedding & Linking Par==on Shard GROUP BY Aggrega=on
  • 9. Data SNIPPET {_id: !ObjectId(4dfa6baa9c65dae09a4bbda5),! title: Programming in Scala,! author: [! !{! ! !first_name: ! !Martin,! ! !last_name: ! !Odersky,! ! !nationality: !DE,! ! !year_of_birth: !1958! !},! !{! ! !first_name: ! !Lex,! ! !last_name: ! !Spoon! !},! !{! ! !first_name: ! !Bill,! ! !last_name: ! !Venners! !}! ]}!
  • 10. CRUD querying INSERT a document in a collec7on > db.foo.insert({name:Sauron, type:bad-ass, address:Mordor, eyes:1})! SELECT all documents in a collec7on > db.foo.find()! SELECT some documents in a collec7on > db.foo.find({eyes:1}) > db.foo.find({eyes:1, type:bad-ass})! UPDATE a document in a collec7on > db.foo.save({_id:10, name:Sauron, type:good boy})! > db.foo.update({type:bad-ass},{$inc:{eyes:1}},{multi:true})! DELETE all documents in a collec7on > db.foo.remove()! DELETE some documents in a collec7on > db.foo.remove({eyes:1})!
  • 12. WRITE CONCERNS Speci鍖es where a write (insert) opera3on has succeeded. In some failure cases, write opera3ons issued with weak write concerns may not persist. weak concern fast writes With stronger write concerns, clients wait aAer sending a write opera3on for MongoDB to con鍖rm the write opera3on. errors ignored w:-1 It does not acknowledge write op. and the client cannot detect failed write op. unacknowledged w:0 It does not acknowledge write op. but driver aUempt to handle network errors. acknowledged w:1 It con鍖rms the receipt of the write op. allowing clients to catch errors. journaled w:1,j:true It con鍖rms the receipt of the write op. only aWer commiXng the data to journal. replica acknowledged w:n (n>1) It con鍖rms the receipt of the write op. aWer acknowledging primary and n-足1 secondaries. DEFAULT
  • 13. INDEXES Without indexes, mongoDB must scan every document in a collec3on! index types Default _ID single field compound index multikey index geospatial index text indexes hashed indexes properties unique indexes sparse indexes creating indexes > db.foo.ensureIndex({phone-number:1}) ! ! > db.foo.ensureIndex({name:1, phone-number:1})! ! > db.foo.ensureIndex({name:1}, {unique:true})! > db.foo.ensureIndex({nickname:1}, {sparse:true})! ! > db.foo.ensureIndex({a:1},{unique:true,sparse:true})!
  • 14. REPLICAtion Replica3on provides redundancy and increases data availability. Automatic failover: ELECTIONS
  • 15. SHARDING horizontal scaling the mongoway SHARDimmutable KEYs shard key is { range based sharding hash based sharding . easily divisible among shards . high degree of randomness . targets a single shard . compound shard key > db.runCommand({ shardcollection:test.users, ! ! ! ! ! !key: { email:1}})! split--ting triggered automatically by a mongos if a chunk goes beyond max size (default 64mb) Balanc ing triggered automatically by a mongos if there is a chunk imbalance (8+ chunks)
  • 16. Aggre | gation MaP Reduce framework operators . filter . project . unwind . group . sort . limit > db.article.aggregate(! !{ $project: {author:1, tags: 1}},! !{ $unwind: $tags},! !{ $group: { !_id: $tags, ! ! ! ! !authors: { $addToSet: $author}}})! { result: !{_id: !{_id: !{_id: !{_id: !],! !ok:1! }! [! art, authors:[bill, bob]},! sports, authors:[jane, bob]},! food, authors:[jane, bob]},! science, authors:[jane, bob, bill]},!
  • 17. still a lot to cover! map reduce geo spatial GRID FS drivers etc.
  • 18. resources hBp://www.mongodb.org/ hBp://www.mongodb.com/learn/nosql hBp://www.mongodb.org/about/introduc7on/ hBp://try.mongodb.org/ hBp://www.slideshare.net/spacemonkeylabs/data-足as-足documents-足overview-足and-足intro-足 to-足mongodb ≒ hBps://speakerdeck.com/backslash451 ≒ hBps://educa7on.mongodb.com/ ≒ hBp://lmgQy.com/?q=mongoDB ≒ ≒ ≒ ≒ ≒