Eliminazione dei documenti
Fa parte della sezione Database con MongoDB del percorso Node.js di Coddy. Lezione 16 di 29.
Per rimuovere un libro basta una chiamata, ma il server deve comunque comunicare al client se c'era un libro da rimuovere.
deleteOne(filter) rimuove il primo documento corrispondente e restituisce { deletedCount }: 1 se ne ha rimosso uno, 0 se non ne ha trovato nessuno. Una rimozione riuscita restituisce 204 No Content, uno stato che non ha un corpo, inviato con res.status(204).end().
const result = await sessions.deleteOne({ token });
if (result.deletedCount === 0) {
// nessuna sessione aveva quel token
}Eliminare due volte lo stesso id non dovrebbe riuscire entrambe le volte. La seconda volta non resta più nulla e il client dovrebbe ricevere un 404.
Sfida
FacileI client possono rimuovere un libro e devono sapere se c'era un libro da rimuovere.
- In
server.js, aggiungi una routeDELETE /books/:id. UsaparseIdper un ID non valido: restituisce 400. - Quando la route rimuove un libro, rispondi con lo stato 204 e senza alcun corpo. Termina la risposta senza inviare JSON.
- Quando nessun libro ha questo
_id, rispondi con lo stato 404 e un errore, per esempio{ "error": "No such book" }. Quindi, eliminando lo stesso libro una seconda volta si ottiene ancora 404, perché è già stato rimosso. Prova: inviaGET /bookse copia l'_iddi Emma. InviaDELETE /books/<Emma's _id>: ottieni 204 e un corpo vuoto. Invia di nuovo la stessa richiesta: ottieni 404. InviaGET /books/<Emma's _id>: ottieni anche in questo caso 404. InviaGET /books: ottieni solo Dune e Kindred e la scheda Data mostra due libri. Premi Run per ripristinare Emma.
Provalo tu
import express from 'express';
import { MongoClient, ObjectId } 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 });
}
// Il parametro :id come ObjectId, oppure null dopo aver restituito 400 per un id non valido.
function parseId(req, res) {
if (ObjectId.isValid(req.params.id)) {
return new ObjectId(req.params.id);
}
sendError(res, 400, 'Not a valid id');
return null;
}
app.get('/', (req, res) => {
res.send('Bookshelf API');
});
app.get('/books', async (req, res) => {
const filter = {};
if (req.query.author) {
filter.author = req.query.author;
}
if (req.query.from || req.query.to) {
filter.year = {};
if (req.query.from) {
filter.year.$gte = Number(req.query.from);
}
if (req.query.to) {
filter.year.$lte = Number(req.query.to);
}
}
const list = await books.find(filter).toArray();
res.json(list);
});
app.post('/books', async (req, res) => {
const book = req.body;
await books.insertOne(book);
res.status(201).json(book);
});
app.get('/books/newest', async (req, res) => {
const n = Number(req.query.n) || 3;
const list = await books
.find({}, { projection: { title: 1, year: 1, _id: 0 } })
.sort({ year: -1 })
.limit(n)
.toArray();
res.json(list);
});
app.get('/books/:id', async (req, res) => {
const id = parseId(req, res);
if (!id) return;
const book = await books.findOne({ _id: id });
if (!book) {
return sendError(res, 404, 'No such book');
}
res.json(book);
});
app.patch('/books/:id', async (req, res) => {
const id = parseId(req, res);
if (!id) return;
const result = await books.updateOne({ _id: id }, { $set: req.body });
if (result.matchedCount === 0) {
return sendError(res, 404, 'No such book');
}
res.json(await books.findOne({ _id: id }));
});
app.post('/books/:id/copies', async (req, res) => {
const id = parseId(req, res);
if (!id) return;
const result = await books.updateOne({ _id: id }, { $inc: { copies: 1 } });
if (result.matchedCount === 0) {
return sendError(res, 404, 'No such book');
}
res.json(await books.findOne({ _id: id }));
});
app.post('/books/:id/tags', async (req, res) => {
const id = parseId(req, res);
if (!id) return;
const result = await books.updateOne({ _id: id }, { $push: { tags: req.body.tag } });
if (result.matchedCount === 0) {
return sendError(res, 404, 'No such book');
}
res.json(await books.findOne({ _id: id }));
});
app.listen(3000, () => {
console.log('Bookshelf is running on port 3000');
});
Tutte le lezioni di Database con MongoDB
1Documenti
Un libro come documentoRaccolte e databaseConnessione a MongoDBLettura dei documenti memorizzatiInserimento di documentiRicerca di un documentoRicerca tramite ObjectIdConfronto tra numeriFiltri di queryScelta dei campi restituitiOrdinamento dei risultati della queryMantenere i primi risultatiProiezione, ordinamento e limite2Modifica dei documenti
Aggiornamento dei documentiOperatori di aggiornamentoEsercitati da solo: Playground Express