Skip to content

Estructura de la base de datos

Los objetos en MongoDB tienen por defecto un ID, por lo que no es necesario crear un campo adicional para ello. En el caso de los usuarios, utilizaré el correo electrónico como identificador único.

📌 Objetos y Relaciones en Lethe

En la web Lethe, gestionaremos una serie de objetos con sus respectivas relaciones:

1️⃣ Usuario

  • mail: Identificador único del usuario.
  • rol: Puede ser contributor, admin o user.
  • phone: Número de teléfono único.
  • password: Contraseña del usuario (string).
  • name: Nombre del usuario.
  • surname: Apellido del usuario.
  • picture: Imagen de perfil.
  • description: Descripción opcional del perfil.
  • time: Tiempo que lleva registrado en Lethe.
  • pines: Relación con Pin. Array de pines acumulados por ayudar a otros a encontrar sus objetos.
  • contributor: Nivel de participación en Lethe.
  • lost: Booleano que indica si ha perdido un objeto.
  • location: Relación con Location. Localización del usuario.

2️⃣ Pin

  • name: Nombre del pin.
  • image: Imagen o SVG del pin.
  • level: Nivel de contributor necesario para obtenerlo.

3️⃣ Location

  • city: Ciudad.
  • country: País.
  • altitude: Coordenada de altitud.
  • longitude: Coordenada de longitud.
  • latitude: Coordenada de latitud.

4️⃣ LostObject

  • findBy: Relación con Usuario. Usuario que lo encontró.
  • where: Relación con Location. Lugar donde se encontró.
  • imgs: Array de imágenes del objeto.
  • date: Fecha en la que se encontró.
  • post_date: Fecha de publicación en la base de datos.
  • description: Descripción del objeto.
  • tags: Array de etiquetas relacionadas con el objeto.

5️⃣ SolvedObject

  • LostObject: Relación con LostObject.
  • when: Fecha en la que se encontró al dueño.
  • owner: Relación con Usuario. Usuario propietario del objeto.

🏗️ Crear la Base de datos descrita

En mongo para construir bases de datos objetos basta con describirlos, si no existen se crearán.

Los comandos en MongoDB Shell (mongosh) para crear la estructura de datos en MongoDB siguiendo tu esquema:

🔹 Seleccionar la base de datos

use lethe

1️⃣ Colección de Usuarios

db.users.insertMany([
{
mail: "user1@example.com",
rol: "user",
phone: "+123456789",
password: "hashedpassword",
name: "John",
surname: "Doe",
picture: "profile1.jpg",
description: "A regular user.",
time: new Date(),
pines: [], // Se llenará con ObjectIds de pines
contributor: 1,
lost: false,
location: ObjectId(), // Relación con Location
},
{
mail: "admin@example.com",
rol: "admin",
phone: "+987654321",
password: "hashedpassword",
name: "Jane",
surname: "Smith",
picture: "profile2.jpg",
description: "Admin user.",
time: new Date(),
pines: [],
contributor: 5,
lost: true,
location: ObjectId(),
},
]);

2️⃣ Colección de Pines

db.pins.insertMany([
{ name: "Bronze Helper", image: "bronze.svg", level: 1 },
{ name: "Silver Helper", image: "silver.svg", level: 3 },
{ name: "Gold Helper", image: "gold.svg", level: 5 },
]);

3️⃣ Colección de Ubicaciones

db.locations.insertMany([
{
city: "Barcelona",
country: "Spain",
altitude: 12.5,
longitude: 2.1734,
latitude: 41.3851,
},
{
city: "New York",
country: "USA",
altitude: 10.2,
longitude: -74.006,
latitude: 40.7128,
},
]);

4️⃣ Colección de Objetos Perdidos (LostObject)

db.lostObjects.insertMany([
{
findBy: ObjectId(), // Se reemplaza con el _id de un usuario
where: ObjectId(), // Se reemplaza con el _id de una ubicación
imgs: ["object1.jpg", "object2.jpg"],
date: new Date("2025-03-15"),
post_date: new Date(),
description: "Mochila negra con un portátil dentro.",
tags: ["mochila", "negro", "portátil"],
},
{
findBy: ObjectId(),
where: ObjectId(),
imgs: ["keys.jpg"],
date: new Date("2025-02-20"),
post_date: new Date(),
description: "Llaves con un llavero de Marvel.",
tags: ["llaves", "llavero", "Marvel"],
},
]);

5️⃣ Colección de Objetos Recuperados (SolvedObject)

db.solvedObjects.insertMany([
{
lostObject: ObjectId(), // Se reemplaza con el _id de un objeto perdido
when: new Date("2025-03-16"),
owner: ObjectId(), // Se reemplaza con el _id del usuario dueño
},
]);

🔥 Cómo relacionar los datos correctamente

Después de insertar los documentos, necesitas actualizar los campos con los ObjectIds generados automáticamente.
Ejemplo para asociar una ubicación a un usuario:

let locationId = db.locations.findOne({ city: "Barcelona" })._id;
db.users.updateOne(
{ mail: "user1@example.com" },
{ $set: { location: locationId } }
);

Ejemplo para asociar un objeto perdido con un usuario y ubicación:

let userId = db.users.findOne({ mail: "user1@example.com" })._id;
let locationId = db.locations.findOne({ city: "New York" })._id;
db.lostObjects.updateOne(
{ description: "Mochila negra con un portátil dentro." },
{ $set: { findBy: userId, where: locationId } }
);

Verificar las inserciones

Para comprobar que los datos se han insertado correctamente:

db.users.find().pretty();
db.pins.find().pretty();
db.locations.find().pretty();
db.lostObjects.find().pretty();
db.solvedObjects.find().pretty();

Esto te mostrará los documentos en formato legible.