javascript

Ejemplo simple de conexión a MongoDB con Mongoose

En este post te mostraré cómo crear un modelo de Mongoose para guardarlo en una base de datos de MongoDB. Además, te mostraré cómo hacer las cuatro operaciones fundamentales.

Será un ejemplo muy simple para comenzar a usar esta librería que permite definir modelos que más adelante vamos a insertar, actualizar, listar o eliminar de una base de datos de MongoDB.

Nota: aquí asumo que ya tienes un poco de conocimiento con node para ejecutar un archivo de JavaScript, iniciar el servidor, etcétera.

Instalando mongoose

En este caso mongoose es una librería de Node que puedes usar con cualquier tecnología que uses en ese servidor, por ejemplo, express.

Para instalarlo usa npm con:

npm install --save mongoose

Conexión con MongoDB

Recomiendo tener la conexión a la base de datos en un archivo separado, y en cada uno de nuestros modelos simplemente incluirla. Entonces la conexión queda así:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/videojuegos', { useNewUrlParser: true, useUnifiedTopology: true });
module.exports = mongoose;

Fíjate en que me estoy conectando a la base de datos llamada videojuegos. Si tú usas usuario y contraseña para acceder, usa algo como lo siguiente:

const mongoose = require('mongoose');
const opciones = {
  user: "usuario",
  pass: "123",
  useNewUrlParser: true,
  useUnifiedTopology: true
};
mongoose.connect('mongodb://localhost:27017/videojuegos?authSource=nombre_base_de_datos_que_contiene_usuario', opciones);
module.exports = mongoose;

En este caso especificamos el usuario y la contraseña en las opciones de conexión. También especificamos la fuente de autenticación que indica la base de datos en donde has creado tu usuario. Normalmente es admin.

Modelo

Ejemplo de modelo en Mongoose para conectar con MongoDB

Ahora que tenemos la conexión vamos a crear un modelo. Mi clase se llama Videojuego, pero también el nombre de la colección. Este último nombre es importante pues así se llamará la colección en la base de datos.

Después vemos las propiedades del modelo. El id será agregado automáticamente, así que no lo estoy especificando. Lo que sí estoy especificando es el nombre, precio y calificación.

En este caso el nombre es de tipo cadena y es requerido. Aquí estamos declarando tipos de datos y validaciones. Para el caso del precio y calificación también estamos indicando el valor mínimo con min.

const mongoose = require('../conexion_mongo');
const Videojuego = mongoose.model('Videojuego', {
    nombre: {
        type: String,
        required: true,
    },
    precio: {
        type: Number,
        required: true,
        min: 0,
    },
    calificacion: {
        type: Number,
        required: true,
        min: 0,
    },
});

module.exports = Videojuego;

Presta atención a cómo se está importando la conexión. En este caso tengo mi modelo dentro de la carpeta llamada modelos, y mi conexión es hermana de esa carpeta. Por eso es que la importo (línea 1) con ../conexion_mongo (la extensión js no es necesaria).

Si por ejemplo mi modelo y conexión residieran en la misma ubicación, la importaría con ./conexion_mongo. Básicamente es importar desde un directorio.

Ahora vamos a importar nuestro modelo desde cualquier lugar que vayamos a hacer operaciones con el mismo con:

var Videojuego = require("../modelos/modeloVideojuego.js");

De nuevo, en este caso es porque estoy dentro de un directorio que no es hermano de modelos, por eso es que uso ../. En caso de que tu modelo esté en otra ubicación simplemente cámbiala como debe ser.

Una nota sobre async, await y promesas

En los ejemplos que te muestro usaré async y await porque he declarado mis funciones como asíncronas. En caso de que tú no lo entiendas o no hayas declarado funciones asíncronas, simplemente cambia el await:

const resultado = await videojuego.save();
// Aquí podrías usar "resultado"
console.log("Guardado");

Por un then:

videojuego.save()
.then((resultado) => {
  // Aquí puede que quieras usar "resultado"
  console.log("Guardado");
});

Esto no tiene que ver con mongoose. Solo es la diferencia entre usar promesas o async y await en JavaScript. Si me preguntas, yo prefiero lo del primer ejemplo.

CRUD con Mongoose

Al fin llegamos al código. Vamos a ver las 4 operaciones.

Cuando quieres hacer un nuevo registro creas una nueva instancia de tu modelo e invocas al método save. En este caso estoy definiendo las propiedades manualmente, pero pueden venir de cualquier lugar.

const videojuego = new Videojuego({
  nombre: "Cuphead",
  precio: 180,
  calificacion: 10,
});
await videojuego.save();
console.log("Guardado");

Cuando quieres obtener todos los registros, invoca al método find:

const videojuegos = await Videojuego.find();
console.log(videojuegos);

Si quieres obtener un registro por id, invoca a findById:

const id = "12354564asdf";
const videojuego = await Videojuego.findById(id);
console.log(videojuego);

En el caso de actualizar un registro por id puedes usar a findOneAndUpdate:

const id = "1235213asdf";
await Videojuego.findOneAndUpdate({
  _id: id,
}, {
  nombre: "Nuevo nombre",
  precio: 500,
  calificacion: 9,
});
console.log("Actualizado");

Fíjate en que el id en este caso está especificado como _id. Y finalmente para eliminar un registro a partir del ID puedes usar findOneAndDelete:

const id = "123213asdf";
await Videojuego.findOneAndDelete({ _id: id });
console.log("Eliminado");

Con esto terminamos las 4 operaciones para interactuar con una base de datos de MongoDB usando Mongoose.

Muy pronto te traeré más ejemplos y proyectos sobre estas tecnologías, mientras tanto te dejo la documentación oficial y más ejemplos de código con JavaScript o MongoDB.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

17 horas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

1 semana hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

1 semana hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

1 semana hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

1 semana hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

1 semana hace

Esta web usa cookies.