Menu
CoddyTech

Inserimento di documenti

Fa parte della sezione Database con MongoDB del percorso Node.js di Coddy. Lezione 5 di 29.

Un client invia un nuovo libro nel corpo di una richiesta POST, e il server deve memorizzarlo e comunicare cosa ha memorizzato.

Ogni documento ha un campo _id, la sua chiave univoca nella raccolta. Se l'oggetto che inserisci non ne ha uno, insertOne ne crea uno e lo scrive anche nello stesso oggetto. La chiamata restituisce solo acknowledged e insertedId, mai il documento. insertedId è un ObjectId, il tipo di id che MongoDB genera. La ricerca tramite ObjectId lo spiega.

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); // lo stesso id

Quindi, dopo l'inserimento, l'oggetto che hai passato è il documento memorizzato, _id incluso: è proprio quello che un client vuole ricevere.

Il codice iniziale inserisce tre libri con insertMany, che accetta un array di documenti. insertOne accetta un solo documento. Entrambe sono operazioni di scrittura asincrone.

challenge icon

Sfida

Facile

Ora i client possono aggiungere libri. Memorizza il libro inviato da un client e invialo di nuovo con il suo nuovo id.

  1. In server.js, sotto GET /books, aggiungi una route POST /books.
  2. Memorizza il corpo JSON come nuovo documento nella raccolta books.
  3. Risponde con lo stato 201 e il libro così come è stato memorizzato, incluso l’_id creato da MongoDB. Per il corpo in Provalo, la risposta è:
    { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }
    Il tuo _id sarà diverso. L’ordine dei campi non è importante. Provalo: invia POST /books con questo corpo: { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Ottieni 201 e il libro con un _id. Invia GET /books: ottieni quattro libri, con Beloved per ultimo. La scheda Dati mostra quattro documenti in books. Premi Esegui di nuovo e Beloved scompare. Ogni esecuzione inizia con un database vuoto e il codice iniziale memorizza di nuovo gli stessi tre libri.

Provalo tu

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

// Ogni errore restituisce { 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');
});

Tutte le lezioni di Database con MongoDB

Esercitati da solo: Playground Express