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.
Aufgabe
EinfachGET /books/newestliefert 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 wirdnewestals 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');
});
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
1Dokumente
Verbindung mit MongoDB herstellenDokumente einfügen