Salta el contingut

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 ) amb el mètode 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:

  1. db.createCollection(): Definim el nom de la col·lecció i algunes propietats. Validació d'Esquemes amb MongoDB

  2. 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
  • moderat → només s’aplica als documents que compleixen la validació
  • estricte → s’aplica a tots els documents

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

  • 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 _id

    Aquest 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"]
    })
Resposta
     *   *   *   *   *   *
    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"
    })
Resposta
{
  acknowledged: true,
  insertedId: ObjectId("6811ff624f9158e3e30b96dd")
}

Ara sí, ja tenim un document dins la col·lecció.

db.alumnes.find()
Resposta
[
  {
    _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.