<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' } ] ``` :::