Menu
CoddyTech

Búsqueda por ObjectId

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

Para responder sobre un libro, el servidor lo busca por _id, pero el id llega en la URL como texto.

Un _id que MongoDB crea es un ObjectId: un valor de 12 bytes escrito como 24 caracteres hexadecimales. JSON lo muestra como una cadena, pero en la base de datos no lo es, así que un filtro con el texto sin modificar no encuentra nada. Primero, convierte el texto en un ObjectId. ObjectId.isValid indica si un texto puede serlo, porque new ObjectId lanza un error con cualquier otra cosa.

import { ObjectId } from 'mongodb';

const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // el pedido, o null
await orders.findOne({ _id: text });               // null: text no es un ObjectId
ObjectId.isValid('42');                            // false

findOne devuelve el primer documento coincidente, o null cuando no hay ninguno.

challenge icon

Desafío

Fácil
  • GET /books/:id responde con el libro cuyo _id coincide.
  • Un id que no puede ser un ObjectId responde con 400.
  • Un id válido sin libro responde con 404.

Copia un _id de GET /books y envía GET /books/<id>. Después, envía GET /books/42.

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.post('/books', async (req, res) => {
    const book = req.body;
    await books.insertOne(book);
    res.status(201).json(book);
});

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

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Bases de datos con MongoDB