Menu
CoddyTech

Insérer des documents

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

Un client envoie un nouveau livre dans le corps d’une requête POST, et le serveur doit le stocker et indiquer ce qu’il a stocké.

Chaque document possède un champ _id, sa clé unique dans la collection. Lorsque l’objet que vous insérez n’en possède pas, insertOne en crée un et l’ajoute également à ce même objet. L’appel ne renvoie que acknowledged et insertedId, jamais le document. insertedId est un ObjectId, le type d’identifiant que MongoDB génère. La recherche par ObjectId permet de comprendre son fonctionnement.

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); // le même id

Ainsi, après l’insertion, l’objet que vous avez transmis est le document stocké, avec son _id : c’est ce que le client souhaite recevoir en retour.

Le code de démarrage insère trois livres avec insertMany, qui prend un tableau de documents. insertOne prend un seul document. Les deux sont des écritures asynchrones.

challenge icon

Défi

Facile

Les clients peuvent maintenant ajouter des livres. Stocke le livre envoyé par un client et renvoie-le avec son nouvel identifiant.

  1. Dans server.js, sous GET /books, ajoute une route POST /books.
  2. Elle stocke le corps JSON comme nouveau document dans la collection books.
  3. Elle répond avec le statut 201 et le livre tel qu’il a été stocké, y compris le _id créé par MongoDB. Pour le corps utilisé dans « Essayer », la réponse est :
    { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }
    Ton _id sera différent. L’ordre des champs n’a pas d’importance. Essaie : envoie POST /books avec ce corps : { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Tu obtiens le statut 201 et le livre avec un _id. Envoie GET /books : tu obtiens quatre livres, avec Beloved en dernier. L’onglet Données affiche quatre documents dans books. Appuie de nouveau sur « Jouer » et Beloved disparaît. Chaque lancement commence avec une base de données vide, et le code de départ stocke à nouveau les trois mêmes livres.

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.listen(3000, () => {
    console.log('Bookshelf is running on port 3000');
});

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

Entraînez-vous par vous-même : Playground Express