<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# MongoDB
<div class="text-end fit-content ms-auto my-3 mt-auto pt-3">
<p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p>
<p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p>
<p><strong>Curs:</strong> 2023/2024</p>
</div>
<div>
<p class="fw-bold mb-0">Llicència: BY-NC-SA</p>
<p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank">
<img class="mx-auto" src="/itb/images/license.png" alt="Licence"/>
</a>
</div><!--license-->
</div><!--cover-->
</div><!--page-->
{:toc}
## Introducció
MongoDB és un sistema de gestió de bases de dades NoSQL popular
i de codi obert. Està dissenyat per emmagatzemar dades en un format flexible
semblant a JSON anomenat BSON (Binary JSON), facilitant el treball amb dades en
aplicacions modernes. MongoDB és conegut per la seva escalabilitat,
flexibilitat i rendiment, fet que el fa adequat per a una àmplia gamma d'usos,
des de projectes de xicoteta escala fins a aplicacions empresarials de gran
envergadura.
::: docs
- [Relational vs. Non-Relational Databases](https://www.mongodb.com/resources/compare/relational-vs-non-relational-databases)
:::
### Conceptes Clau
- __Base de dades de documents__: MongoDB és una base de dades orientada a
documents, és a dir, emmagatzema les dades en documents en lloc de taules.
- __Documents__: Un document és una unitat bàsica d'emmagatzematge de dades a MongoDB.
L'estructura dels documents és similar a JSON. Cada document és una col·lecció de
parells de __claus-valor__, on les claus són cadenes de caràcters i els valors poden ser de
diversos tipus de dades.
- __Col·leccions__: Les dades s'organitzen en col·leccions a MongoDB.
Una col·lecció és un grup de documents similars, que podria ser comparat amb una taula
en una base de dades relacional. A diferència de les taules en una base de dades relacionals,
els documents d'una col·lecció no han de tindre l'estructura de dades idèntica.
## Instal·lació
::: tip
Vos recomane seguir el tutorial [Complete MongoDB Tutorial](https://www.youtube.com/watch?v=ExcRbA7fy_A&list=PL4cUxeGkcC9h77dJ-QJlwGlZlTd4ecZOA)
de Net Ninja, on explica pas a pas què és MongoDB, com instal·lar-lo i com utilitzar-lo.
- [Complete MongoDB Tutorial #2 - Installing MongoDB](https://www.youtube.com/watch?v=gDOKSgqM-bQ&list=PL4cUxeGkcC9h77dJ-QJlwGlZlTd4ecZOA&index=3)
- https://www.youtube.com/watch?v=xhSm4o-lDb4
:::
Per instal·lar MongoDB, seguiu les instruccions de la [pàgina oficial de MongoDB](https://www.mongodb.com/try/download/community).
Treballarem amb la versió 7.0.9 de MongoDB.
És recomanable instal·lar __MongoDB Compass__, una interfície gràfica d'usuari per a MongoDB
que facilita la visualització i l'exploració de les dades a la base de dades.
També cal instal·lar __MongoDB Shell__, una eina de línia de comandes per interactuar amb la base de dades MongoDB.
- [MongoDB Shell](https://www.mongodb.com/try/download/shell)
Per executar l'eina `mongosh`, obriu una terminal (com Powershell) i executeu la comanda `mongosh`.
```shell
PS C:\Users\joapuiib> .yellow{mongosh}
Current Mongosh Log ID: 662fc527889f41720f46b798
Connecting to: .green{mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.5}
Using MongoDB: 7.0.9
.yellow{Using Mongosh}: 2.2.5
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
.yellow{------}
.yellow{The server generated these startup warnings when booting}
2024-04-29T16:10:28.259+02:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
.yellow{------}
test>
```
## Comandes Bàsiques
Utilitzarem l'eina de línia de comandes `mongosh` per interactuar amb la base de dades MongoDB.
A continuació, es mostren algunes comandes bàsiques per començar.
### Bases de dades
::: tip
- [Complete MongoDB Tutorial #5 - Using the MongoDB Shell](https://www.youtube.com/watch?v=jR49YGYXdxc&list=PL4cUxeGkcC9h77dJ-QJlwGlZlTd4ecZOA&index=5)
:::
MongoDB utilitza la comanda `use` per crear o utilitzar una base de dades.
Si la base de dades no existeix, MongoDB la crearà automàticament.
::: info
Quan s'utilitza la comanda `use`, MongoDB no crea la base de dades fins que s'afegisquen dades a la base de dades.
:::
```mongodb
use nom_base_de_dades
```
::: example
Creem la base de dades `llibres`:
```mongodb
database> use llibres
switched to db llibres
llibres>
```
:::
Per mostrar les bases de dades existents, utilitzeu la comanda `show dbs`.
```mongodb
show dbs
```
Per mostrar la base de dades actual, utilitzeu la comanda `db`.
```mongodb
db
```
### Col·leccions
Una __col·lecció__ és un grup de documents similars. A continuació, es mostren algunes comandes bàsiques per treballar amb col·leccions:
Per crear una col·lecció, utilitzeu la comanda `db.createCollection()` amb el nom de la col·lecció com a argument.
```mongodb
db.createCollection('nom_colleccio')
```
::: success "Bona pràctica"
Així com a SQL la convenció de nomenclatura és utilitzar el singular per al nom de les taules,
en MongoDB es considera una bona pràctica utilitzar el __plural__ per al nom de la col·lecció.
:::
::: example
Creem la col·lecció `autors`:
```mongodb
llibres> db.createCollection('autors')
{ "ok" : 1 }
```
:::
Per mostrar les col·leccions existents, utilitzeu la comanda `show collections`.
```mongodb
show collections
```
Per eliminar una col·lecció, utilitzeu la comanda `db.collection.drop()`
amb el nom de la col·lecció com a argument.
::: danger
Aquesta comanda eliminarà la col·lecció i tots els documents que conté.
:::
```mongodb
db.collection.drop()
```
### Documents
Un __document__ és una unitat bàsica d'emmagatzematge de dades a MongoDB. Les dades
s'emmagatzemen en documents en format BSON (Binary JSON) i s'estructuren
en parells de __clau-valor__.
#### Inserció
Per insertar un document a una col·lecció, utilitzeu la comanda `db.collection.insertOne()`
amb les dades del document com a argument.
```mongodb
db.collection.insertOne({
key1: value1,
key2: value2,
...
})
```
::: example
Afegim un document a la col·lecció `autors`:
```mongodb
llibres> db.autor.insertOne({
"_id": 0,
"nom": "Irene Solà",
"data_naixement": new Date("1990-09-16"),
"nacionalitat": "Espanyola",
"biografia": "Irene Solà (Malla, 1990) és escriptora i traductora...",
"llibres": []
})
{
"acknowledged" : true,
"insertedId" : 0
}
```
:::
Tots els documents de MongoDB tenen un camp `_id` que actua com a identificador únic
per al document dins de la col·lecció. Si no s'especifica un `_id`, MongoDB
crearà un identificador únic per al document.
Si voleu inserir més d'un document a la vegada, utilitzeu la comanda `db.collection.insertMany()`
amb una llista de documents com a argument.
```mongodb
db.collection.insertMany([
{ key1: value1, key2: value2, ... },
{ key1: value1, key2: value2, ... },
...
])
```
#### Consulta
Per consultar els documents d'una col·lecció, utilitzeu la comanda `db.collection.find()`.
```mongodb
> db.collection.find()
```
::: example
Consultem els documents de la col·lecció `autors`:
```mongodb
llibres> db.autors.find()
[
{
_id: 0,
nom: 'Irene Solà',
data_naixement: ISODate('1990-09-16T00:00:00.000Z'),
nacionalitat: 'Espanyola',
biografia: 'Irene Solà (Malla, 1990) és escriptora i traductora...',
llibres: []
}
]
```
:::
## Recursos addicionals
- [Pàgina oficial de MongoDB](https://www.mongodb.com/)
- [Complete MongoDB Tutorial](https://www.youtube.com/watch?v=ExcRbA7fy_A&list=PL4cUxeGkcC9h77dJ-QJlwGlZlTd4ecZOA) de Net Ninja
- [MongoDB per Luís García Bonifaz](https://luisgarciabonifaz.github.io/BDA/Tema04/MongoDB/)
- [MongoDB per Aitor Medrano](https://aitor-medrano.github.io/iabd2223/sa/02mongo.html)