Удаление документов
Часть раздела Базы данных с MongoDB путешествия по Node.js на Coddy. Урок 8 из 18.
Для удаления книги нужен один вызов, но сервер всё равно должен сообщить клиенту, была ли книга для удаления.
deleteOne(filter) удаляет первый подходящий документ и возвращает { deletedCount }: 1, если документ был удалён, и 0, если совпадений не найдено. В ответ на успешное удаление отправляется 204 No Content — статус без тела ответа, с помощью res.status(204).end().
const result = await sessions.deleteOne({ token });
if (result.deletedCount === 0) {
// ни у одной сессии не было этого токена
}Повторное удаление одного и того же id не должно завершаться успехом. При второй попытке документа уже не будет, и клиент должен получить ответ 404.
Задание
ЛегкоDELETE /books/:idудаляет книгу и отвечает кодом204без тела ответа.- Для неизвестного идентификатора возвращается код
404, поэтому повторный запросDELETEдля той же книги тоже вернёт этот код.
Удалите книгу, отправьте тот же запрос DELETE ещё раз, затем откройте вкладку Data.
Попробуйте сами
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());
// При любой ошибке возвращается { error: message }.
function sendError(res, status, message) {
res.status(status).json({ error: message });
}
// Возвращает :id как ObjectId или null после ответа с кодом 400, если id некорректен.
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');
});
Все уроки раздела Базы данных с MongoDB
2Изменение документов
Обновление документовОператоры обновления