Dokumente aktualisieren
Teil des Abschnitts Datenbanken mit MongoDB der Node.js-Journey von Coddy. Lektion 6 von 18.
Wenn du das Erscheinungsjahr eines Buchs korrigierst, sollte sich nur dieses Feld ändern und alle anderen unverändert bleiben.
updateOne(filter, update) ändert das erste Dokument, auf das der Filter zutrifft. Das Update besteht aus Operatoren: $set schreibt die angegebenen Felder und lässt alle anderen Felder unverändert. Ein einfaches Objekt ohne Operator wird mit „Update document requires atomic operators“ abgelehnt.
const result = await players.updateOne(
{ name: 'Ada' },
{ $set: { score: 120, level: 4 } }
);
result.matchedCount; // 1, wenn ein Spieler gefunden wurde, 0, wenn keiner gefunden wurde
result.modifiedCount; // 0, wenn die Werte bereits gleich warenUnterscheide mit matchedCount zwischen einem fehlenden Dokument und einem unveränderten Dokument, nicht mit modifiedCount. Das Update gibt das Dokument nicht zurück. Lies es daher erneut mit findOne aus.
Aufgabe
EinfachPATCH /books/:idändert nur die Felder im Body und antwortet mit dem aktualisierten Buch mit200.- Bei einer unbekannten ID wird mit
404geantwortet.parseIdim Starter antwortet bei einer ungültigen ID bereits mit400.
Sende PATCH /books/<id> mit { "year": 1966 } und sieh dir das Buch im Daten-Tab an.
Probier es selbst
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());
// Jeder Fehler wird mit { error: message } beantwortet.
function sendError(res, status, message) {
res.status(status).json({ error: message });
}
// Die :id als ObjectId oder null, nachdem bei einer ungültigen id mit 400 geantwortet wurde.
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);
});
// Füge hier PATCH /books/:id hinzu.
app.listen(3000, () => {
console.log('Bookshelf is running on port 3000');
});
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.