DAM - DAW - MP 0484 Bases de Dades
Aquesta part de l'exercici podem fer-la des de qualsevol de les eines que hem instal·lat com a client:
-
MongoDB Compass
-
MongoDB Shell
-
NoSQLBooster for MongoDB
Primeres passes i creació d’una db (DataBase).
Anirem comprovant la/es bases de dades MongoDB tant des de la shell (comanda mongodb.exe) com des de l’eina instal·lada CompassMongoDB.
Per veure les bases de dades que tenim podem executar la comanda show dbs. No cal acabar les comandes amb punt i coma (;)
> show dbs
admin 8.00 KiB
config 12.00 KiB
local 8.00 KiB
Podem comprovar que tenim 3 bases de dades.
Per a crear i utilitzar una base de dades (si no està creada la crearà) utilitzarem la comanda use.
> use prova
switched to db prova
Per a veure’n les col·leccions executarem la comanda show collections
> use prova
switched to db prova
> show collections
> use local
switched to db local
> show collections
startup_log
Podem veure que tenim una col·lecció a la base de dades local, però, cap a la que acabem de crear, prova.
Per eliminar una base de dades ho farem des de dins d’ella (use db.dropDatabase()
> use prova
switched to db prova
> db.dropDatabase()
{ ok: 1, dropped: 'prova' }
> show databases
admin 40.00 KiB
config 12.00 KiB
local 40.00 KiB
I les col·leccions, com les creem?
Col·leccions
Una col·lecció és l’equivalent a una taula en SQL. Com les creem en MongoDB? Tenim dues opcions:
-
db.createCollection(): Definim el nom de la col·lecció i algunes propietats. Validació d'Esquemes amb MongoDB -
db.exemple.insert(): Afegim dades i ja es crearà la col·lecció si aquesta no existeix.
Opcions per a una col·lecció:
capped |
Valor booleà que juntament amb la opció size permet definir la mida d’una capped collection (en Bytes). |
autoIndex |
Valor booleà que especifica l’ús o no del camp _id. Tota col·lecció necessita una clau primària i aquesta pot ser un camp que indiquem nosaltres o bé un cap automàtic que crea el mateix SGBD. |
max |
Valor enter que determina el nombre màxim de documents (registres) a la col·lecció (taula) |
validator |
Document que defineix les validacions de cada camp. |
validationLevel |
Nivell de restriccions a les validacions
|
Normalment no crearem les col·leccions però la sintaxi seria
db.createCollection(<name>, { options } )
i com a exemple...
use prova
db.createCollection ("carpetaFitxers",
{ capped: true,
size: 6142800,
max: 10000
} )
db.createCollection( "alumnes",
{ validator: { $or:
[
{ telefon: { $type: "string" } },
{ email: { $regex: /@institutmontilivi\.cat$/ } },
{ estat: { $in: [ "Desconegut", "Incomplet" ] } }
]
}
} )
i el MongoDB respon
{ "ok" : 1 }
> show collections
alumnes
carpetaFitxers
Documents
Un Document:
-
NO TÉ una estructura definida
-
TÉ format JSON
-
S’emmagatzema en col·leccions
-
Equival als registres/files de les taules SQL
-
SÓN PARELLS CLAU-VALOR
-
La clau primària per defecte és
_idAquest camp és un ObjectId, està format per 12 bytes, i el veiem en format hexadecimal, indicant el següent i en el següent ordre:
-
4 bytes que són la marca de temps que indica el nombre de segons transcorreguts des de l’1 de gener de 1970 equivalent a l’hora Unix
-
3 bytes que identifiquen la màquina on es troben els registres (hash obtingut a partir del nom de xarxa de la màquina)
-
2 bytes que identifiquen el procés que genera el ObjectId
-
3 bytes que són un comptador incremental. D’aquesta manera, vàries instruccions en un sol segon generen nombres diferents. Fins a 23*8 operacions en un segon en un mateix procés (224 = 16.777.216)
-
Per afegir Documents en una Col·lecció utilitzem el mètode insert. Abans haurem creat la base de dades i especificarem la col·lecció on volem afegir el document.
db.alumnes.insertOne(
{ Nom:"Joan", Cognoms:"Bosch", Cicle:"DAW",
Curs: 1, Moduls:["0483","0484","0485"]
})
* * * * * *
MongoServerError: Document failed validation
* * * * * *
Sortida d'error completa
db.alumnes.insertOne({Nom:"Joan", Cognoms:"Bosch", Cicle:"DAW", Curs: 1,Moduls:["0483","0484","0485"]})
Uncaught:
MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId("641d53b4c176da9e24b0d3d5"),
details: {
operatorName: '$or',
clausesNotSatisfied: [
{
index: 0,
details: {
operatorName: '$type',
specifiedAs: { telefon: { '$type': 'string' } },
reason: 'field was missing'
}
},
{
index: 1,
details: {
operatorName: '$regex',
specifiedAs: { email: { '$regex': /@institutmontilivi\.cat$/ } },
reason: 'field was missing'
}
},
{
index: 2,
details: {
operatorName: '$in',
specifiedAs: { estat: { '$in': [Array] } },
reason: 'field was missing'
}
}
]
}
}
Cal comprovar que hagi anat bé. Al tenir un validador, no ens ha deixat inserir l’alumne sense telefon, email o estat. Afegim-li un estat i tornem a provar.
db.alumnes.insertOne(
{ Nom:"Joan", Cognoms:"Bosch", Cicle:"DAW",
Curs: 1,Moduls:["0483","0484","0485"],
estat:"Incomplet"
})
{
acknowledged: true,
insertedId: ObjectId("6811ff624f9158e3e30b96dd")
}
Ara sí, ja tenim un document dins la col·lecció.
db.alumnes.find()
[
{
_id: ObjectId("6811ff624f9158e3e30b96dd"),
Nom: 'Joan',
Cognoms: 'Bosch',
Cicle: 'DAW',
Curs: 1,
Moduls: [ '0483', '0484', '0485' ],
estat: 'Incomplet'
}
]
Fixeu-vos com ens ha creat un camp identificador i ens hi ha posat un valor:
_id : ObjectId("6811ff624f9158e3e30b96dd")
El vostre valor _id no coincidirà amb el d’aquest document.