Menu
CoddyTech

Recherche par ObjectId

Fait partie de la section Bases de données avec MongoDB du Journey Node.js de Coddy. Leçon 3 sur 18.

Pour répondre au sujet d’un livre, le serveur le recherche à l’aide de _id, mais l’identifiant arrive dans l’URL sous forme de texte.

Un _id créé par MongoDB est un ObjectId : une valeur de 12 octets écrite sous la forme de 24 caractères hexadécimaux. JSON l’affiche sous forme de chaîne, mais dans la base de données, ce n’en est pas une ; un filtre avec du texte brut ne trouve donc rien. Convertis d’abord le texte en ObjectId. ObjectId.isValid indique si un texte peut en être un, car new ObjectId déclenche une exception dans tout autre cas.

import { ObjectId } from 'mongodb';

const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // la commande, ou null
await orders.findOne({ _id: text });               // null : text n'est pas un ObjectId
ObjectId.isValid('42');                            // false

findOne renvoie le premier document correspondant, ou null si aucun ne correspond.

challenge icon

Défi

Facile
  • GET /books/:id renvoie le livre ayant cet _id.
  • Un identifiant qui ne peut pas être un ObjectId renvoie 400.
  • Un identifiant valide sans livre correspondant renvoie 404.

Copiez un _id depuis GET /books et envoyez GET /books/<id>. Envoyez ensuite GET /books/42.

Essayez vous-même

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());

// Chaque erreur renvoie { 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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Bases de données avec MongoDB