Menu
CoddyTech

Inserción de documentos

Parte de la sección Bases de datos con MongoDB del Journey de Node.js de Coddy. Lección 5 de 29.

Un cliente envía un libro nuevo en el cuerpo de una solicitud POST, y el servidor tiene que guardarlo e indicar qué guardó.

Cada documento tiene un campo _id, su clave única en la colección. Cuando el objeto que insertas no tiene uno, insertOne crea uno y también lo escribe en ese mismo objeto. La llamada solo devuelve acknowledged y insertedId, nunca el documento. insertedId es un ObjectId, el tipo de id que genera MongoDB. Buscar por ObjectId lo explica.

const movie = { title: 'Alien', year: 1979 };
const result = await movies.insertOne(movie);

console.log(result);    // { acknowledged: true, insertedId: new ObjectId('66f1...') }
console.log(movie._id); // el mismo id

Así que, después de la inserción, el objeto que pasaste es el documento almacenado, con _id incluido: eso es lo que un cliente quiere recibir.

El código inicial inserta tres libros con insertMany, que recibe un arreglo de documentos. insertOne recibe un documento. Ambas son escrituras asíncronas.

challenge icon

Desafío

Fácil

Ahora los clientes pueden añadir libros. Guarda el libro que envía un cliente y devuélveselo con su nuevo id.

  1. En server.js, debajo de GET /books, añade una ruta POST /books.
  2. Guarda el cuerpo JSON como un documento nuevo en la colección books.
  3. Responde con el estado 201 y el libro tal como se guardó, incluido el _id que creó MongoDB. Para el cuerpo de «Pruébalo», la respuesta es:
    { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }
    Tu _id será diferente. El orden de los campos no importa. Pruébalo: envía POST /books con este cuerpo: { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Obtendrás 201 y el libro con un _id. Envía GET /books: obtendrás cuatro libros, con Beloved al final. La pestaña Datos muestra cuatro documentos en books. Pulsa «Ejecutar» otra vez y Beloved habrá desaparecido. Cada ejecución comienza con una base de datos vacía, y el código inicial vuelve a guardar los mismos tres libros.

Pruébalo tú mismo

import express from 'express';
import { MongoClient } from 'mongodb';

const client = new MongoClient('mongodb://localhost:27017');
const db = client.db('shelf');
const books = db.collection('books');

await books.insertMany([
    { title: 'Dune', author: 'Frank Herbert', year: 1965, isbn: '9780441013593', genre: 'scifi' },
    { title: 'Kindred', author: 'Octavia E. Butler', year: 1979, isbn: '9780807083697', genre: 'scifi' },
    { title: 'Emma', author: 'Jane Austen', year: 1815, isbn: '9780141439587', genre: 'classic' },
]);

const app = express();
app.use(express.json());

// Cada error responde con { error: message }.
function sendError(res, status, message) {
    res.status(status).json({ error: message });
}

app.get('/', (req, res) => {
    res.send('Bookshelf API');
});

app.get('/books', async (req, res) => {
    const list = await books.find().toArray();
    res.json(list);
});

app.listen(3000, () => {
    console.log('Bookshelf is running on port 3000');
});

Todas las lecciones de Bases de datos con MongoDB

Practica por tu cuenta: Playground de Express