Menu

MongoDB con Node.js: ejemplos del driver (find, insert)

Usa MongoDB desde Node.js con el driver oficial mongodb: conéctate con MongoClient y luego inserta, busca, actualiza y borra documentos de una colección, todo con async/await.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Para usar MongoDB desde Node.js, instala el driver oficial (npm install mongodb), conéctate con new MongoClient(uri), elige una base de datos con client.db('name') y una colección con db.collection('name'). Cada operación (insertOne, find, updateOne, deleteOne) devuelve una promesa, así que la esperas con await. Los documentos entran y salen como objetos normales de JavaScript.

Imprime [ 'Dune', 'Neuromancer', 'Hyperion' ]. La base de datos shop y la colección books no existían antes: MongoDB las crea con la primera inserción, y toArray() carga todos los documentos a los que apunta el cursor de find().

Buscar documentos con filtros y projection

Un filtro es un objeto que describe los documentos que quieres. Los valores simples coinciden de forma exacta; los operadores como $gt, $lt, $in y $regex van en un objeto anidado. La projection del segundo argumento elige qué campos se devuelven.

recent contiene los dos libros más nuevos posteriores a 1960, Hyperion y después Neuromancer, solo con title y year; findOne devuelve la primera coincidencia (o null), y countDocuments cuenta 2 libros que cuestan 10 o más. Cambia $gt: 1960 por $gt: 1985 y solo queda Hyperion.

Actualizar y borrar

updateOne(filter, update) cambia el primer documento que coincide. La actualización usa operadores: $set reemplaza campos, $inc suma a un número, $unset elimina un campo y $push añade al final de un array. updateMany y deleteMany actúan sobre todas las coincidencias.

La actualización encontró y modificó un documento, así que Dune ahora cuesta 10 con 2 en stock, y al borrar el libro sin stock queda 1. Una actualización tiene que usar operadores: pasa { price: 10 } sin $set y el driver la rechaza (replaceOne es la llamada que reemplaza un documento entero).

ObjectId e índices

Cada documento tiene un _id; si no lo defines tú, el driver crea un ObjectId. Para buscar un documento por un id que llegó como string (desde una URL, por ejemplo), envuélvelo en new ObjectId(id). Un índice hace que un campo sea rápido de buscar, y un índice único hace que MongoDB rechace duplicados.

Un ObjectId son 24 caracteres hexadecimales como string, y buscar con el string tal cual no encuentra nada, así que esa línea imprime null. La segunda inserción rompe el índice único y falla con el código 11000, que es como detectas que "el email ya está en uso".

Usar MongoDB en una API con Express

Conéctate una sola vez al arrancar el servidor y comparte la colección; no abras una conexión nueva en cada petición. El driver mantiene un pool de conexiones y las reutiliza.

GET /books devuelve los dos libros, cada uno con un _id. Copia un id en GET /books/<id> para obtener un solo libro, o envía POST /books con un body JSON como {"title": "Foundation", "year": 1951} y vuelve a listar los libros.

Una app real lee el connection string de process.env.MONGODB_URI en lugar de escribirlo en el código.

Si quieres esquemas y validación encima del driver, Mongoose (npm install mongoose) lo envuelve:

const Book = mongoose.model('Book', new mongoose.Schema({ title: String, year: Number }));
await Book.create({ title: 'Dune', year: 1965 });

Errores comunes

Olvidar toArray(). find() devuelve un cursor, no documentos. Si lo imprimes verás un objeto cursor; llama a toArray(), o recórrelo con for await.

Conectarse en cada petición. Cada new MongoClient abre su propio pool. Crea un cliente al arrancar y reutilízalo en todas partes.

No cerrar nunca el cliente en un script. Un cliente abierto mantiene vivo el proceso cuando tu código ya ha terminado. Llama a await client.close() al final de los scripts; un servidor lo mantiene abierto durante toda su vida.

Preguntas frecuentes

¿Uso el driver de mongodb o Mongoose?

El driver es la capa oficial y más fina: trabajas con objetos normales y con el lenguaje de consultas propio de MongoDB. Mongoose añade encima esquemas, validación y modelos, lo que ayuda cuando quieres que se compruebe cada documento. Los dos hablan con la misma base de datos, y Mongoose usa el driver por debajo.

¿Tengo que crear antes la base de datos o la colección?

No. MongoDB crea las dos la primera vez que insertas un documento en ellas. client.db('shop') y db.collection('books') solo devuelven referencias.

¿Dónde pongo el connection string?

En una variable de entorno como MONGODB_URI, que lees con process.env.MONGODB_URI. El string de una base de datos alojada contiene una contraseña, así que nunca debe subirse al repositorio.

¿Por qué find no devuelve documentos cuando busco por id?

_id se guarda como ObjectId, no como string, así que { _id: '65f1...' } no coincide con nada. Conviértelo antes: { _id: new ObjectId(id) }.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

Comenzar