WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
Back to basics Italian webinar 2 Mia prima applicazione MongoDB
1.
2. Back to Basics 2017 : Webinar 2
La Tua Prima Applicazione
Massimo Brignoli
Principal Solution Architect
MongoDB
massimo@mongodb.com
@massimobrignoli
V1.0
3. 3
Riassunto della Parte 1
• Perché esistono i NoSQL
• I vari tipi di database NoSQL
• Le caratteristiche principali di MongoDB
4. 4
Agenda
• I concetti base
• Installare MongoDB
• Costruire un’applicazione base di blogging
• Aggiungere gli indici
• Ottimizzare le query con l’explain
9. 9
Installare MongoDB
$ curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.1.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
$ 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. 10
Eseguire mongod
JD10Gen:mongodb mbrignoli$ ./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.4.1
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. 11
Connettersi Via Shell
$ ./bin/mongo
MongoDB shell version: 3.4.1
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. 12
Inserire 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" }
>
17. 17
In MongoDB possiamo farlo in modo organico
> use blog
switched to db blog
> db.users.insert( { "username" : ”mbrignoli", "password" : "top secret", "lang" : ”IT" } )
WriteResult({ "nInserted" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("573afff65ee4be80385332a7"),
"username" : ”mbrignoli",
"password" : "top secret",
"lang" : ”IT"
}
18. 18
Come lo facciamo in un programma?
'''
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" : "top secret",
"lang" : “IT" })
user = usersCollection.find_one()
print( user )
19. 19
Passiamo agli Articles
…
articlesCollection = blogDatabase[ "articles" ]
author = ”mbrignoli"
article = { "title" : ”Questo è il mio primo post",
"body" : ”Questo è il contenuto del mio post, posso aggiungere un sacco di testo qua.",
"author" : author,
"tags" : [ ”massimo", "general", ”Italia", "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 )
20. 20
Creiamo un nuovo tipo di articolo
#
# Lets add a new type of article with a posting date and a section
#
author = ”mbrignoli"
title = ”Questo è un post su MongoDB"
newPost = { "title" : title,
"body" : ”MongoDB è il database NoSQL più popolare del mondo. E’ un database a
documenti.",
"author" : author,
"tags" : [ ”massimo", "mongodb", ”Italia" ],
"section" : "technology",
"postDate" : datetime.datetime.now(),
}
#
# Lets check if our author exists
#
if usersCollection.find_one( { "username" : author }) :
articlesCollection.insert_one( newPost )
34. 34
Overview degli Indici
• Parametri
– Background : Crea un indice in background senza lockare il db
– Unique : Tutte le chiavi nella collection devono essere uniche.
– Name : Da un nome all’indice, altrimenti il nome sarà generato automaticamente
• Cancellare un indice
– db.users.dropIndex({ “username” : 1 })
• Mostrare tutti gli indici
– db.users.getIndexes()
35. 35
Passaggi nell’esecuzione del Query Plan
• COLLSCAN : full scan di una collection
• IXSCAN : Scansione di un indice
• FETCH : per leggere i documenti
• SHARD_MERGE : Per unire i risultati dagli shard
38. 38
Cosa Abbiamo Imparato
• Come creare un database e una collection
• Come inserire contenuto in una collection
• Come interrogare una collection
• Come aggiornare un documento
• Come cancellare un documento
• Come controllare l’efficienza di una query
• Come aggiungere un indice
• Come controllare che un indice sia usato durante una
query
39. 39
Prossimo Webinar : Introduzione ai Replica Sets
• Come assicurare che I vostri dati sia durabili
• Come recuperare da failure automaticamente
• Come scrivere codice sicuro lato clienti
Martedì, 20 Giugno 2017, 11:00 CET.