Menu
CoddyTech

Projektion, Sortierung und Limit

Teil des Abschnitts Datenbanken mit MongoDB der Node.js-Journey von Coddy. Lektion 5 von 18.

Eine Liste der „neuesten Bücher“ benötigt der Reihe nach einige Felder aus einigen Büchern.

Eine Projektion wählt die Felder aus, die eine Abfrage zurückgibt: 1 behält ein Feld bei, und _id wird mitgeliefert, sofern du es nicht auf 0 setzt. Auf dem Cursor sortiert sort({ field: -1 }) von groß nach klein (1 sortiert von klein nach groß), und limit(n) behält die ersten n Ergebnisse bei.

// die 5 höchsten Punktzahlen, nur Name und Punktzahl
await players
    .find({}, { projection: { name: 1, score: 1, _id: 0 } })
    .sort({ score: -1 })
    .limit(5)
    .toArray();

Die Datenbank sortiert, bevor sie das Limit anwendet, unabhängig davon, in welcher Reihenfolge du die beiden Aufrufe verkettest. Das Sortieren des Arrays in JavaScript nach limit sortiert die falschen fünf Ergebnisse.

challenge icon

Aufgabe

Einfach
  • GET /books/newest liefert die neuesten Bücher zuerst, jeweils nur als { "title", "year" }.
  • ?n= gibt an, wie viele; ohne den Parameter sind es 3.
  • Platziere die Route oberhalb von GET /books/:id, sonst wird newest als ID gelesen.

Sende GET /books/newest, dann GET /books/newest?n=1.

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

// Bei jedem Fehler lautet die Antwort { 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 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/:id', async (req, res) => {
    if (!ObjectId.isValid(req.params.id)) {
        return sendError(res, 400, 'Not a valid id');
    }
    const book = await books.findOne({ _id: new ObjectId(req.params.id) });
    if (!book) {
        return sendError(res, 404, 'No such book');
    }
    res.json(book);
});

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