Questo è il secondo webinar della serie Back to Basics che ti offrirà un'introduzione al database MongoDB. In questo webinar ti dimostreremo come creare un'applicazione base per il blogging in MongoDB.
3. Back to Basics 2016 : Webinar 2
La Tua Prima Applicazione MongoDB
{
name:”Massimo Brignoli”,
role:”Principal Solutions Architect”
region:”EMEA”,
company:”MongoDB”,
contacts: [ {type:”email”, address:massimo@mongodb.com},
{type:”twitter”,nick:”@massimobrignoli”} ]
hashtag:”#back2basics”
}
4. Agenda Del Corso
Date Time Webinar
24 Maggio 2016 11:00 CET Introduzione a NoSQL
07 Giugno 2016 11:00 CET La tua prima applicazione MongoDB
21 Giugno 2016 11:00 CET Schema Design – Pensare in Documenti
05 Luglio 2016 11:00 CET Indicizzazione avanzata: Indici Testuali e Geografici
19 Luglio 2016 11:00 CET Introduzione all’ Aggregation Framework
28 Luglio 2016 11:00 CET Messa in Esercizio
5. Riassunto del Webinar Precedente
• Perché esistono i NoSQL
• I vari tipi di database NoSQL
• La funzionalità principali di MongoDB
• La durabilità dei dati in MongoDB – Replica Sets
• Scalabilità in MongoDB - Sharding
6. Agenda
• Concetti base del database
• Installare MongoDB
• Costruiamo una semplice applicazione di blogging
• Aggiungiamo gli indici
• Ottimizzazione delle Query usando explain()
7. Concetti di Base
Relazionale MongoDB
Database Database
Tabella Collection
Riga Documento
Indice Indice
Join Lookup
Foreign Key Reference
Transazioni Multi-tabella Transazione singolo
documento
8. Scaricare MongoDB
$ curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.2.6.tgz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 60.9M 100 60.9M 0 0 2730k 0 0:00:22 0:00:22 --:--:-- 1589k
9. Scompattare MongoDB
$ tar xzvf mongodb-osx-x86_64-3.2.6.tgz
x mongodb-osx-x86_64-3.2.6/README
x mongodb-osx-x86_64-3.2.6/THIRD-PARTY-NOTICES
x mongodb-osx-x86_64-3.2.6/MPL-2
x mongodb-osx-x86_64-3.2.6/GNU-AGPL-3.0
x mongodb-osx-x86_64-3.2.6/bin/mongodump
x mongodb-osx-x86_64-3.2.6/bin/mongorestore
x mongodb-osx-x86_64-3.2.6/bin/mongoexport
x mongodb-osx-x86_64-3.2.6/bin/mongoimport
x mongodb-osx-x86_64-3.2.6/bin/mongostat
x mongodb-osx-x86_64-3.2.6/bin/mongotop
x mongodb-osx-x86_64-3.2.6/bin/bsondump
x mongodb-osx-x86_64-3.2.6/bin/mongofiles
x mongodb-osx-x86_64-3.2.6/bin/mongooplog
x mongodb-osx-x86_64-3.2.6/bin/mongoperf
x mongodb-osx-x86_64-3.2.6/bin/mongosniff
x mongodb-osx-x86_64-3.2.6/bin/mongod
x mongodb-osx-x86_64-3.2.6/bin/mongos
x mongodb-osx-x86_64-3.2.6/bin/mongo
$ ln -s mongodb-osx-x86_64-3.2.6 mongodb
10. Eseguire MongodJD10Gen:mongodb massimobrignoli $ ./bin/mongod --dbpath /data/b2b
2016-05-23T19:21:07.767+0100 I CONTROL [initandlisten] MongoDB starting : pid=49209 port=27017 dbpath=/data/b2b 64-
bit host=JD10Gen.local
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] db version v3.2.6
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] git version: 05552b562c7a0b3143a729aaa0838e558dc49b25
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] allocator: system
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] modules: none
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] build environment:
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] distarch: x86_64
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] target_arch: x86_64
2016-05-23T19:21:07.768+0100 I CONTROL [initandlisten] options: { storage: { dbPath: "/data/b2b" } }
2016-05-23T19:21:07.769+0100 I - [initandlisten] Detected data files in /data/b2b created by the 'wiredTiger'
storage engine, so setting the active storage engine to 'wiredTiger'.
2016-05-23T19:21:07.769+0100 I STORAGE [initandlisten] wiredtiger_open config:
create,cache_size=4G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true
,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB)
,statistics_log=(wait=0),
2016-05-23T19:21:08.837+0100 I CONTROL [initandlisten]
2016-05-23T19:21:08.838+0100 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256,
should be at least 1000
2016-05-23T19:21:08.840+0100 I NETWORK [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
2016-05-23T19:21:08.840+0100 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory
'/data/b2b/diagnostic.data'
2016-05-23T19:21:08.841+0100 I NETWORK [initandlisten] waiting for connections on port 27017
2016-05-23T19:21:09.148+0100 I NETWORK [initandlisten] connection accepted from 127.0.0.1:59213 #1 (1 connection now
open)
11. Collegarsi Attraverso la Shell
$ ./bin/mongo
MongoDB shell version: 3.2.6
connecting to: test
Server has startup warnings:
2016-05-17T11:46:03.516+0100 I CONTROL [initandlisten]
2016-05-17T11:46:03.516+0100 I CONTROL [initandlisten] **
WARNING: soft rlimits too low. Number of files is 256,
should be at least 1000
>
12. Inserite il vostro primo record
> show databases
local 0.000GB
> use test
switched to db test
> show databases
local 0.000GB
> db.demo.insert( { "key" : "value" } )
WriteResult({ "nInserted" : 1 })
> show databases
local 0.000GB
test 0.000GB
> show collections
demo
> db.demo.findOne()
{ "_id" : ObjectId("573af7085ee4be80385332a6"), "key" : "value" }
>
16. In MongoDB possiamo farlo in modo organico
> use blog
switched to db blog
> db.users.insert( { "username" : ”mbrignoli", "password" : ”chevelodicoafare", "lang" : ”IT" } )
WriteResult({ "nInserted" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("573afff65ee4be80385332a7"),
"username" : ”mbrignoli",
"password" : " chevelodicoafare",
"lang" : ”IT"
}
17. Come lo facciamo in un’applicazione?
'''
Created on 17 May 2016
@author: mbrignoli
'''
import pymongo
#
# client defaults to localhost and port 27017. eg MongoClient('localhost', 27017)
client = pymongo.MongoClient()
blogDatabase = client[ "blog" ]
usersCollection = blogDatabase[ ”users" ]
usersCollection.insert_one( { "username" : ”mbrignoli",
"password" : ”chevelodicoafare",
"lang" : ”IT" })
user = usersCollection.find_one()
print( user )
18. Inseriamo un Articolo
…
articlesCollection = blogDatabase[ ”articles" ]
author = ”mbrignoli"
article = { "title" : "This is my first post",
"body" : "The is the longer body text for my blog post. We can add lots of text here.",
"author" : author,
"tags" : [ ”massimo", "general", ”italy", "admin" ]
}
#
# Lets check if our author exists
#
if usersCollection.find_one( { "username" : author }) :
articlesCollection.insert_one( article )
else:
raise ValueError( "Author %s does not exist" % author )
19. Creare un nuovo tipo di articolo
• #
• # Lets add a new type of article with a posting date and a section
• #
• author = ”mbrignoli"
• title = "This is a post on MongoDB"
•
• newPost = { "title" : title,
• "body" : "MongoDB is the worlds most popular NoSQL database. It is a document
database",
• "author" : author,
• "tags" : [ ”massimo", "mongodb", ”italy" ],
• "section" : "technology",
• "postDate" : datetime.datetime.now(),
• }
• #
• # Lets check if our author exists
• #
• if usersCollection.find_one( { "username" : author }) :
• articlesCollection.insert_one( newPost )
33. Indici
• Parametri:
– Background : crea un indice in the background invece di lockare il database
– Unique : Tutte le chiavi della collection devono essere uniche
– Name : nome esplicito per l’indice. Se non presente il nome verrà generato
automaticamente
• Cancellare un indice
– db.users.dropIndex({ “username” : 1 })
• Ottenere tutti gli indici di una collection
– db.users.getIndexes()
34. Tipi di Stage del Piano di Esecuzione
• COLLSCAN : Per una scansione di tutta la collection
• IXSCAN : Per la scansione di un indice
• FETCH : Per ritornare dei documenti
• SHARD_MERGE : Per fare il merge dei risultati tra
shard.
38. Cosa abbiamo imparato
• Come creare un database a una collection
• Come inserire del contenuto in una collection
• Come interrogare il database
• Come aggiornare un documento
• Come cancellare un documento
• Come controllare l’efficienza di un’operazione
• Come creare un indice
• Come controllare che un indice venga usato in
un’operazione
39. Prossimo Webinar : Pensare in
• Invece della normalizzazione vedremo un approccio ibrido allo
schema che fornisce una mappatura coerenti tra gli oggetti della
vostra applicazione e gli oggetti nel database.
• Poi andremo ad ottimizzare lo schema per alcune query in base
al pattern che ci aspettiamo di vedere.
• Alla fine vedremo come lo schema dinamico e lo schema
validation vi permettono di estendere il vostro schema in un
modo controllato
21-June-2016, 11:00 GMT.