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'); // falsefindOne renvoie le premier document correspondant, ou null si aucun ne correspond.
Défi
FacileGET /books/:idrenvoie 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');
});
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
1Documents
Connexion à MongoDBInsertion de documents