Rechercher par ObjectId
Fait partie de la section Bases de données avec MongoDB du Journey Node.js de Coddy. Leçon 7 sur 29.
Pour récupérer un livre, le serveur le recherche à partir de son _id, mais l’identifiant arrive sous forme de texte dans l’URL.
Un _id créé par MongoDB est un ObjectId : une valeur de 12 octets écrite sous forme de 24 caractères hexadécimaux : les chiffres de 0 à 9 et les lettres de a à f. JSON l’affiche sous forme de chaîne, mais ce n’est pas le cas dans la base de données ; un filtre utilisant le texte brut ne correspond donc à rien. Convertis d’abord le texte en ObjectId. ObjectId.isValid indique si un texte peut être un ObjectId, car new ObjectId provoque une erreur dans les autres 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
FacileCette étape ouvre le projet d’API de bibliothèque préparé pour le cours, plutôt que les fichiers de votre projet de Insertion de documents (y compris server.js). Votre travail précédent reste dans sa propre leçon. Lisez les fichiers fournis avant de modifier server.js. Cette copie contient les routes de liste et d’insertion des livres.
Un client veut un livre, choisi par son _id.
- Dans
server.js, ajoutez une routeGET /books/:id. - L’identifiant dans l’URL est du texte. Certains textes ne peuvent jamais être un ObjectId, qui contient 24 caractères composés de chiffres et des lettres de a à f. Pour ce texte, répondez avec le statut 400 et une erreur, en utilisant
sendError, par exemple{ "error": "Not a valid id" }. Vérifiez cela avant de construire un ObjectId, car en construire un à partir d’un texte incorrect provoque une erreur. - Sinon, recherchez le livre à partir de son
_id. Lorsque vous le trouvez, répondez avec le statut 200 et le livre :{ "_id": "6720a1f4c2b9e81d3a5f0c11", "title": "Dune", "author": "Frank Herbert", "year": 1965, "isbn": "9780441013593", "genre": "scifi" }. - Lorsqu’aucun livre ne possède cet
_id, répondez avec le statut 404 et une erreur, par exemple{ "error": "No such book" }. Essayez : envoyezGET /bookset copiez l’_idde Dune : les 24 caractères qui suivent"_id":. Chaque fois que vous cliquez sur « Jouer », les livres reçoivent de nouveaux identifiants ; copiez donc l’identifiant à nouveau après chaque clic sur « Jouer ». EnvoyezGET /books/suivi de l’identifiant que vous avez copié : vous obtenez 200 et Dune. EnvoyezGET /books/42: vous obtenez 400. EnvoyezGET /books/000000000000000000000000: c’est un identifiant valide qu’aucun livre ne possède, vous obtenez donc 404.
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
Un livre comme documentCollections et bases de donnéesSe connecter à MongoDBLire des documents stockésInsérer des documentsTrouver un documentRechercher par ObjectIdComparer des nombresFiltres de requêteChoisir les champs renvoyésTrier les résultats de requêteConserver les premiers résultatsProjection, tri et limiteEntraînez-vous par vous-même : Playground Express