<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# Consultes bàsiques
<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 proprociona una sintaxi per realitzar consultes flexible i potent, però diferent de la que proporciona el llenguatge SQL.
## Consultes bàsiques
Totes les consultes a MongoDB es realitzen mitjançant la crida a la funció `find` sobre una col·lecció.
```mongodb
db.collection.find()
```
Aquesta funció retorna els 20 primers documents de la col·lecció.
Si volem veure els següents 20 documents, podem utilitzar la funció `it`:
```mongodb
it
```
::: example
Consultem tots els documents de la col·lecció `llibres`:
```mongodb
db.llibres.find()
```
:::
## Filtrar documents
Podem filtrar els documents que retorna la consulta afegint un objecte
amb els criteris com a paràmetre de la funció `find`:
```mongodb
db.collection.find({ camp: valor })
```
::: example
Consultem els llibres de l'autor `Irene Solà`:
```mongodb
db.llibres.find({ autor: 'Irene Solà' })
```
:::
### Operadors de comparació
Podem utilitzar els següents operadors de comparació per filtrar els documents:
- `$eq`: igual que (_equals_). Aquest és l'operador per defecte.
- `$ne`: diferent de (_not equals_).
- `$gt`: més gran que (_greater than_).
- `$gte`: més gran o igual que (_greater than or equals_).
- `$lt`: més xicotet que (_less than_).
- `$lte`: més xicoteT o igual que (_less than or equals_).
::: example "$eq"
La consulta anterior és equivalent a:
```mongodb
db.llibres.find({ autor: { $eq: 'Irene Solà' } })
```
:::
::: example "$gt"
Consultem els llibres amb més de 200 pàgines:
```mongodb
db.llibres.find({ nombre_pagines: { $gt: 200 } })
```
:::
### Múltiples criteris
Podem afegir múltiples criteris de filtrat a la consulta, que s'han de complir tots:
```mongodb
db.collection.find({ camp1: valor1, camp2: valor2 })
```
::: example
Consultem els llibres de l'autora `Sara Mesa` amb més de 200 pàgines:
```mongodb
db.llibres.find({ autor: 'Sara Mesa', nombre_pagines: { $gt: 200 } })
```
:::
### Operadors lògics
Podem utilitzar els següents operadors lògics per combinar criteris de filtrat:
- `$and`
- `$or`
- `$not`
::: example "$and"
Consultem els llibres de l'autora __Sara Mesa__ amb menys de 200 pàgines:
```mongodb
db.llibres.find({
$and: [
{ autor: 'Sara Mesa' },
{ nombre_pagines: { $lt: 200 } }
]
})
```
:::
::: example "$not"
Consultem els llibres que no són de l'autora __Sara Mesa__:
```mongodb
db.llibres.find({ autor: { $not: { $eq: 'Sara Mesa' } } })
```
:::
### Operadors amb strings
MongoDB supporta __expressions regulars__ per filtrar strings:
```mongodb
db.collection.find({ camp: /expressió/ })
db.collection.find({ camp: { $regex: 'expressió' } })
```
::: example
Consultem els llibres que contenen la paraula 'família' al resum:
```mongodb
db.llibres.find({ resum: /família/ })
```
:::
### Operadors amb arrays
Podem utilitzar els següents operadors per filtrar arrays:
- `$in`: conté algun dels elements (_in_).
- `$nin`: no conté cap dels elements (_not in_).
- `$all`: conté tots els elements (_all_).
- `$size`: té la mida (_size_).
- `$elemMatch`: conté algun element que compleixi els criteris (_element match_).
::: example "$in"
Consultem els llibres que són del gènere `novel·la` o `poesia`:
```mongodb
db.llibres.find({ genere: { $in: ['novel·la', 'poesia'] } })
```
:::
::: example "$all"
Consultem els llibres que són dels gèneres `ciència-ficció` i `bèl·lic`:
```mongodb
db.llibres.find({ genere: { $all: ['ciència-ficció', 'bèl·lic'] } })
```
:::
::: example "$elemMatch"
Consultem els llibres que tenen un gènere que conté la paraula `ficció`:
```mongodb
db.llibres.find({ genere: { $elemMatch: { $regex: 'ficció' } } })
```
:::
### Operadors amb dates
Podem utilitzar els següents operadors per filtrar dates:
- Operadors de comparació: `$gt`, `$gte`, `$lt`, `$lte`.
- Operadors de temps: `$year`, `$month`, `$dayOfMonth`, `$dayOfWeek`.
::: example "$gte i $lte"
Consultem els llibres publicats entre les dates `2022-06-01` i `2022-12-31`:
```mongodb
db.llibres.find({ data_publicacio: { $gte: new Date('2022-06-01'), $lte: new Date('2022-12-31') } })
```
:::
## Ordenació
Podem ordenar els documents d'una consulta amb la funció `sort`:
```mongodb
db.collection.find().sort({ camp: 1 })
```
El valor de l'objecte passat a la funció `sort` és:
- `1`: ordenació ascendent (_ascendent_).
- `-1`: ordenació descendent (_descendent_).
Es poden ordenar per múltiples camps afegint-los a l'objecte:
```mongodb
db.collection.find().sort({ camp1: 1, camp2: -1 })
```
::: example
Consultem els llibres ordenats per data de publicació de forma descendent:
```mongodb
db.llibres.find().sort({ data_publicacio: -1 })
```
:::
## Selecció de camps
La funció `find` accepta un segon paràmetre per seleccionar els camps que volem mostrar:
```mongodb
db.collection.find({}, { camp1: 1, camp2: 1 })
```
Els valors per seleccionar els camps són:
- `1`: incloure el camp (_include_).
- `0`: excloure el camp (_exclude_).
El comportament és el següent:
- Si no s'especifica aquest camp, es mostraran tots els camps dels documents.
- Si s'especifica aquest camp, per defecte sols es mostraran els camps `_id` i els que s'especifiquen amb el valor `1`.
::: example
Consultem els títols dels llibres de l'autora `Sara Mesa` sense incloure l'identificador:
```mongodb
db.llibres.find({ autor: 'Sara Mesa' }, { _id: 0, titol: 1 })
[ { titol: 'La familia' }, { titol: 'Un amor' } ]
```
:::
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari