Menu
CoddyTech

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 waren

Unterscheide 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.

challenge icon

Aufgabe

Einfach
  • PATCH /books/:id ändert nur die Felder im Body und antwortet mit dem aktualisierten Buch mit 200.
  • Bei einer unbekannten ID wird mit 404 geantwortet. parseId im Starter antwortet bei einer ungültigen ID bereits mit 400.

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');
});
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Datenbanken mit MongoDB