Salta el contingut

4. DQL en NoSQL

En aquest apartat veurem les operacions de consulta (DQL) en MongoDB: l'operador find, les condicions i operadors disponibles, la projecció i l'ordenació.

4.1. L'operador FIND

Per realitzar consultes s'utilitza l'operador find. És important recordar que find busca DOCUMENTS, no subdocuments concrets.

La sintaxi:

JavaScript
db.<col·lecció>.find(<filtre o where>, <projecció>).<operacions especials>

Característiques

  • No hi ha cap filtre obligatori: si no posem res, obtindrem tots els documents de la col·lecció.
  • Les condicions en Mongo s'utilitzen en moltes operacions (find, aggregate, update, ...).

Exemple de find:

Exemple de find

4.2. Condicions i operadors

Operadors de condició

  • $type: consulta per tipus de dada.
  • $exists: consulta si el camp existeix.
  • $regex: expressió regular a complir.
  • $and, $nor, $or, $not: operadors booleans.
  • $in, $nin: contingut en / no contingut en.
  • $eq: true si els valors són equivalents.
  • $gt, $gte, $lt, $lte, $ne: major que, major o igual que, menor que, menor o igual que, distint.
  • $where: satisfà una expressió en JavaScript.
  • $all: arrays que compleixen tindre tots els elements.
  • $elemMatch: especificacions a complir en arrays.
  • $size: indica la grandària de l'array.

4.2.1. FIND $type

Com que en NoSQL podem tindre un camp que unes vegades tinga un tipus de dada i altres vegades un altre, pot interessar-nos traure aquells documents on un determinat camp tinga un tipus concret.

Exemple: en una base de dades de pel·lícules i comentaris, traure totes aquelles en què el títol és un string:

JavaScript
db.movies.find({ title: { $type: "string" } }).pretty();

4.2.2. FIND $exists

S'utilitza per traure aquells documents on existeix o no existeix el camp.

Per exemple, traure les pel·lícules on no apareixen actors:

JavaScript
db.movies.find({ cast: { $exists: false } }).pretty();

4.2.3. FIND $regex

Per utilitzar expressions regulars.

Per exemple, pel·lícules el títol de les quals comença per «The»:

JavaScript
db.movies.find({ title: { $regex: /^The.*/ } }).pretty();

4.2.4. FIND $and

Serveix per afegir restriccions que s'han de complir totes. Es fa de forma implícita, per la qual cosa no és necessari utilitzar-lo.

Per exemple, pel·lícules que comencen per «The» i són espanyoles (countries és un array de països):

JavaScript
1
2
3
4
db.movies.find({ $and: [ { title: { $regex: /^The.*/ } }, { countries: "Spain" } ] }).pretty();

// Equivalent:
db.movies.find({ title: { $regex: /^The.*/ }, countries: "Spain" }).pretty();

Alerta

En el cas de fer la consulta sobre el mateix camp, unit amb $and SÍ que és necessari posar-lo.

Per exemple, pel·lícules que siguen d'Espanya i dels EUA:

JavaScript
db.movies.find({ $and: [ { countries: "Spain" }, { countries: "USA" } ] }).pretty();

4.2.5. FIND $or

En aquest cas fa un or lògic i sí que és necessari posar-lo.

Per exemple, les pel·lícules que comencen per «El» o siguen espanyoles:

JavaScript
db.movies.find({ $or: [ { title: { $regex: /^El.*/ } }, { countries: "Spain" } ] }).pretty();

4.2.6. FIND $not, $nor

$not és negar l'element, és a dir, el distint.

Per exemple, pel·lícules que no siguen espanyoles:

JavaScript
db.movies.find({ countries: { $not: { $eq: "Spain" } } }).pretty();

$nor és negar les dues opcions, és a dir, ni això ni allò.

Per exemple, pel·lícules que no són ni espanyoles ni dels EUA:

JavaScript
db.movies.find({ $nor: [ { countries: "Spain" }, { countries: "USA" } ] }).pretty();

4.2.7. FIND $eq

S'utilitza com a operador d'igualtat. No sol utilitzar-se, però hi ha casos en què és necessari, com per exemple quan volem negar que siga espanyola:

JavaScript
db.movies.find({ countries: { $not: { $eq: "Spain" } } }).pretty();

Altres operadors de comparació

  • $ne: distint de.
  • $in: contingut en una llista de valors.
  • $nin: no contingut en una llista de valors.
  • $gt, $gte, $lt, $lte: major que, major o igual que, menor que, menor o igual que.

Exemple: pel·lícules amb més de 5 premis:

JavaScript
db.movies.find({ "awards.wins": { $gt: 5 } }).pretty();

4.2.8. Altres operadors

  • $where: permet utilitzar una expressió JavaScript com a filtre.
  • $all: selecciona documents on l'array conté tots els elements indicats.
  • $elemMatch: permet posar condicions sobre elements dins d'un array.
  • $size: selecciona documents on l'array té una grandària concreta.

4.3. Projectar

Com en SQL, podem projectar i traure sols alguns elements o traure dades combinades. La sintaxi és la següent:

JavaScript
{ <element1>: 1, <element2>: 1, ... }
  • Es posen els camps a traure junt a un 1 o true.
  • Si posem un 0 o false, el camp no apareix (també podem no posar-lo directament).

Alerta

El camp _id sempre apareix; per tant, en cas de no voler que aparega, hem de dir explícitament que no aparega.

JavaScript
db.movies.find({}, { _id: 0, title: 1, countries: 1 }).pretty();

4.4. Ordenar

Ordena de forma ascendent (1) o descendent (-1):

JavaScript
sort({ element1: 1 | -1, element2: 1 | -1, ... })

Per exemple, ordenar les pel·lícules espanyoles per número de premis de forma descendent:

JavaScript
db.movies.find({ countries: "Spain" }).sort({ "awards.wins": -1 }).pretty();