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.
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
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
.
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.
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.
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.