Comandi base Mongodb
Subito dopo l’installazione, MongoDB non ha utenti preimpostati ma un meccanismo detto Localhost Exception che permette di accedere come amministratore a tutti gli utenti che tentano di accedere dalla stessa macchina in cui si trova il server.
Come primo step creare un utente amministratore degli utenti di tutti i database presenti in MongoDB.
I ruoli userAdminAnyDatabase e readWriteAnyDatabase permettono di creare ed eliminare utenti, ruoli e cambiare password, e può essere fatto su ogni database presente nell’istanza.
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Creiamo un utente amministratore.
> use admin
switched to db dbtest01
> db.createUser(
{
user: "uadm01",
pwd: "uadm01",
roles: [{role: "root" , db:"admin"}]
}
)
GridFS è una specifica che permette di memorizzare e richiamare file che superano la dimensione di 16MB dei documenti BSON.
Quindi invece di memorizzare un file in un solo documento, divide un file in singoli pezzi della dimenzione di 255KB (tranne l'ultimo pezzo) e li memorizza in singoli documenti.
Il vantaggio dell'utilizzo di GridFS è che è possibile accedere a solo una parte del file di interesse (esempio viedo, audio) senza doverlo caricare tutto in memoria.
Creiamo il file del dizionario
cat /usr/share/dict/linux.words > /tmp/dictionary
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-05T16:30:11.907+0200 connected to: localhost
Importiamo il fine nel database creato prima.
# mongofiles -u heroadmin -p heroadmin -d heroesdb put /tmp/dictionary
2019-07-05T16:30:30.180+0200 connected to: localhost
2019-07-05T16:30:30.334+0200 added file: /tmp/dictionary
Visualizziamo i file memorizzati nel db e la loro dimensione.
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-05T16:30:35.352+0200 connected to: localhost
/tmp/dictionary 4953699
Interroghiamo il file presente nel database.
# mongo -u heroadmin -p heroadmin heroesdb
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/heroesdb?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("cd1308f0-7bff-47cf-a063-40db646a9776") }
MongoDB server version: 4.0.10
> db
heroesdb
> db.fs.files.find()
{ "_id" : ObjectId("5d2436717cdd491269f2ec7d"), "chunkSize" : 261120, "uploadDate" : ISODate("2019-07-09T06:38:42.499Z"), "length" : 4953699, "md5" : "40c0825855792bd20e8a2d515fe9c3e3", "filename" : "/tmp/dictionary" }
>
GridFS memorizza i files in due collection:
- chunks - memorizza pezzi di binari
- files - memorizza i metadati del file
Ricerchiamo un file.
Creare un file e importiamolo nel db.
#cp /tmp/dictionary /tmp/vacaboli
# mongofiles -u heroadmin -p heroadmin -d heroesdb put /tmp/vacaboli
Come primo step creare un utente amministratore degli utenti di tutti i database presenti in MongoDB.
I ruoli userAdminAnyDatabase e readWriteAnyDatabase permettono di creare ed eliminare utenti, ruoli e cambiare password, e può essere fatto su ogni database presente nell’istanza.
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Creiamo un utente amministratore.
> use admin
switched to db dbtest01
> db.createUser(
{
user: "uadm01",
pwd: "uadm01",
roles: [{role: "root" , db:"admin"}]
}
)
Il ruolo root ha accesso alle operazioni e a tutte le risorse: readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin, restore e backup.
Autenticarsi come admin al db dbtest01
> mongo -u admin01 -p admin01 admin
oppure
#mongo
> use admin
switched to db admin
> db.auth("uadm01","uadm01")
1
Per vedere la lista degli utenti, eseguire il comando
> show users
oppure
> db.getUsers()
Per cancellare un utente eseguire il comando
> db.dropUser("alfo")
true
Per cambiare la pwd
> db.changeUserPassword("heroadmin","heroadmin")
Creare un database
Accedere con utenza amministratore e creare un utenza amministratore del db da creare.
# mongo -u admin -p admin admin
> use heroesdb
> db.createUser(
{ user: "heroadmin",
pwd: "heroadmin",
roles: [{role: "dbOwner" , db:"heroesdb"}]
})
Test di connessione da localhost:
# mongosh --host localhost --port 27017 --username heroadmin --password heroadmin
# mongosh --host localhost --port 27017 --username heroadmin --password heroadmin
--authenticationDatabase heroesdb
Uscire dalla shell mongo e autenticarsi come nuovo user e creare il db.
mongo -u heroadmin -p heroadmin heroesdb
> db
heroesdb
Creare una collection.
> db.heroes.insert( {hero:"Punisher", name:"Frank", surname:"Castle", groups:" "} )
WriteResult({ "nInserted" : 1 })
La insert crea sia il database heroesdb che la collection heroes.
Per visualizzare le collection
> show collections
heroes
Per visualizzare il contenuto di una collection
> db.heroes.find()
{ "_id" : ObjectId("5d10e552d2334baaa925d7f2"), "hero" : "Daredevil", "name" : "Matthew", "surname" : "Murdock", "groups" : "Defenders" }
Per inserire documenti multipli
> db.heroes.insert([
{hero:"Ironman", name:"Tony", surname:"Stark", groups:"Avengers"} ,
{hero:"Wolverine", name:"James", surname:"Howlett", groups:["Avengers","X-men"]},
])
Per cancellare una collection
> db.heroes.drop()
Interrogare una collection:
> db.heroes.find({ "_id" : ObjectId("5d1ddbaed879aee31e5407c3")})
{ "_id" : ObjectId("5d1ddbaed879aee31e5407c3"), "hero" : "Ironman", "name" : "Tony", "surname" : "Stark", "groups" : "Avengers" }
> db.heroes.find({"surname": "Howlett"})
{ "_id" : ObjectId("5d1ddbaed879aee31e5407c4"), "hero" : "Wolverine", "name" : "James", "surname" : "Howlett", "groups" : [ "Avengers", "X-men" ] }
> db.heroes.find({"groups" : "Avengers"})
{ "_id" : ObjectId("5d1ddbaed879aee31e5407c3"), "hero" : "Ironman", "name" : "Tony", "surname" : "Stark", "groups" : "Avengers" }
{ "_id" : ObjectId("5d1ddbaed879aee31e5407c4"), "hero" : "Wolverine", "name" : "James", "surname" : "Howlett", "groups" : [ "Avengers", "X-men" ] }
Per droppare un database
#mongo -u "heroadmin" -p "heroadmin" heroesdb
> show dbs
heroesdb 0.000GB
> db.dropDatabase()
{ "dropped" : "heroesdb", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
Il drop del db non cancella gli utenti ad esso associati.
GridFS
Quindi invece di memorizzare un file in un solo documento, divide un file in singoli pezzi della dimenzione di 255KB (tranne l'ultimo pezzo) e li memorizza in singoli documenti.
Il vantaggio dell'utilizzo di GridFS è che è possibile accedere a solo una parte del file di interesse (esempio viedo, audio) senza doverlo caricare tutto in memoria.
Creiamo il file del dizionario
cat /usr/share/dict/linux.words > /tmp/dictionary
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-05T16:30:11.907+0200 connected to: localhost
Importiamo il fine nel database creato prima.
# mongofiles -u heroadmin -p heroadmin -d heroesdb put /tmp/dictionary
2019-07-05T16:30:30.180+0200 connected to: localhost
2019-07-05T16:30:30.334+0200 added file: /tmp/dictionary
Visualizziamo i file memorizzati nel db e la loro dimensione.
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-05T16:30:35.352+0200 connected to: localhost
/tmp/dictionary 4953699
Interroghiamo il file presente nel database.
# mongo -u heroadmin -p heroadmin heroesdb
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/heroesdb?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("cd1308f0-7bff-47cf-a063-40db646a9776") }
MongoDB server version: 4.0.10
> db
heroesdb
> db.fs.files.find()
{ "_id" : ObjectId("5d2436717cdd491269f2ec7d"), "chunkSize" : 261120, "uploadDate" : ISODate("2019-07-09T06:38:42.499Z"), "length" : 4953699, "md5" : "40c0825855792bd20e8a2d515fe9c3e3", "filename" : "/tmp/dictionary" }
>
GridFS memorizza i files in due collection:
- chunks - memorizza pezzi di binari
- files - memorizza i metadati del file
Ricerchiamo un file.
Creare un file e importiamolo nel db.
#cp /tmp/dictionary /tmp/vacaboli
# mongofiles -u heroadmin -p heroadmin -d heroesdb put /tmp/vacaboli
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-09T10:48:27.509+0200 connected to: localhost
/tmp/dictionary 4953699
/tmp/vacaboli 4953699
# mongofiles -u heroadmin -p heroadmin -d heroesdb search vacaboli
2019-07-09T10:56:07.275+0200 connected to: localhost
/tmp/vacaboli 4953699
# mongofiles -u heroadmin -p heroadmin -d heroesdb search dict
2019-07-09T10:56:12.660+0200 connected to: localhost
/tmp/dictionary 4953699
Cancellare un file
# mongofiles -u heroadmin -p heroadmin -d heroesdb delete /tmp/vacaboli
2019-07-09T10:57:23.382+0200 connected to: localhost
2019-07-09T10:57:23.458+0200 successfully deleted all instances of '/tmp/vacaboli' from GridFS
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-09T10:57:35.424+0200 connected to: localhost
/tmp/dictionary 4953699
# mongofiles -u heroadmin -p heroadmin -d heroesdb delete /tmp/vacaboli
2019-07-09T10:57:23.382+0200 connected to: localhost
2019-07-09T10:57:23.458+0200 successfully deleted all instances of '/tmp/vacaboli' from GridFS
# mongofiles -u heroadmin -p heroadmin -d heroesdb list
2019-07-09T10:57:35.424+0200 connected to: localhost
/tmp/dictionary 4953699