En aquest tema, aprendrem sobre les referències a MongoDB, una tècnica essencial per modelar relacions entre documents en una base de dades NoSQL. Les referències ens permeten enllaçar documents de diferents col·leccions, similar a les claus foranes en bases de dades SQL.

Conceptes Clau

  1. Referències Manuales: Enllaçar documents mitjançant identificadors.
  2. $lookup: Operació d'agregació per unir col·leccions.
  3. Normalització vs. Desnormalització: Estratègies de modelatge de dades.

Referències Manuales

Les referències manuals impliquen emmagatzemar l'identificador d'un document en un altre document. Això ens permet enllaçar documents de diferents col·leccions.

Exemple

Suposem que tenim dues col·leccions: autors i llibres.

Col·lecció autors:

{
  "_id": ObjectId("60c72b2f9b1d8b3a4c8b4567"),
  "nom": "J.K. Rowling",
  "nacionalitat": "Britànica"
}

Col·lecció llibres:

{
  "_id": ObjectId("60c72b3f9b1d8b3a4c8b4568"),
  "títol": "Harry Potter i la Pedra Filosofal",
  "autor_id": ObjectId("60c72b2f9b1d8b3a4c8b4567")
}

En aquest exemple, el camp autor_id en el document del llibre emmagatzema l'identificador de l'autor corresponent.

Recuperar Documents Relacionats

Per recuperar documents relacionats, primer obtenim l'identificador del document referenciat i després fem una segona consulta.

Exemple en JavaScript (Node.js):

const MongoClient = require('mongodb').MongoClient;

async function getBookWithAuthor(bookId) {
  const client = await MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true });
  const db = client.db('biblioteca');

  const book = await db.collection('llibres').findOne({ _id: bookId });
  const author = await db.collection('autors').findOne({ _id: book.autor_id });

  console.log({
    títol: book.títol,
    autor: author.nom,
    nacionalitat: author.nacionalitat
  });

  client.close();
}

getBookWithAuthor(ObjectId("60c72b3f9b1d8b3a4c8b4568"));

$lookup: Unir Col·leccions

L'operació $lookup ens permet unir col·leccions en una sola consulta, similar a una operació JOIN en SQL.

Exemple

Consulta amb $lookup:

db.llibres.aggregate([
  {
    $lookup: {
      from: "autors",
      localField: "autor_id",
      foreignField: "_id",
      as: "autor_info"
    }
  }
]);

Aquesta consulta unirà la col·lecció llibres amb la col·lecció autors basant-se en el camp autor_id i emmagatzemarà la informació de l'autor en un camp anomenat autor_info.

Normalització vs. Desnormalització

Normalització

La normalització implica dividir les dades en múltiples col·leccions per reduir la redundància. Això és útil quan les dades canvien freqüentment.

Avantatges:

  • Menys redundància.
  • Actualitzacions més fàcils.

Desavantatges:

  • Consultes més complexes.
  • Més operacions de lectura.

Desnormalització

La desnormalització implica emmagatzemar dades relacionades en un sol document. Això és útil per a consultes ràpides.

Avantatges:

  • Consultes més ràpides.
  • Menys operacions de lectura.

Desavantatges:

  • Més redundància.
  • Actualitzacions més complicades.

Exercici Pràctic

Enunciat

  1. Crea dues col·leccions: clients i comandes.
  2. Afegeix documents a cada col·lecció amb una referència manual.
  3. Utilitza $lookup per unir les col·leccions i mostrar els resultats.

Solució

Col·lecció clients:

{
  "_id": ObjectId("60c72b4f9b1d8b3a4c8b4569"),
  "nom": "Anna Pérez",
  "correu": "[email protected]"
}

Col·lecció comandes:

{
  "_id": ObjectId("60c72b5f9b1d8b3a4c8b4570"),
  "producte": "Ordinador Portàtil",
  "quantitat": 1,
  "client_id": ObjectId("60c72b4f9b1d8b3a4c8b4569")
}

Consulta amb $lookup:

db.comandes.aggregate([
  {
    $lookup: {
      from: "clients",
      localField: "client_id",
      foreignField: "_id",
      as: "client_info"
    }
  }
]);

Conclusió

Les referències a MongoDB són una tècnica poderosa per modelar relacions entre documents. Hem après a utilitzar referències manuals i l'operació $lookup per unir col·leccions. També hem discutit les estratègies de normalització i desnormalització per optimitzar el modelatge de dades. Amb aquests coneixements, estàs preparat per gestionar relacions complexes en les teves bases de dades MongoDB.

© Copyright 2024. Tots els drets reservats