Abfragefilter
Teil des Abschnitts Datenbanken mit MongoDB der Node.js-Journey von Coddy. Lektion 4 von 18.
Ein Client möchte oft nur bestimmte Bücher, und die Datenbank kann die Auswahl übernehmen.
Das Objekt, das du an find übergibst, ist ein Filter: Ein Dokument stimmt überein, wenn jedes Feld im Filter übereinstimmt. Ein einfacher Wert bedeutet Gleichheit. Ein Operator ist ein Schlüssel, der mit $ beginnt und stattdessen einen Vergleich durchführt: $gte bedeutet größer oder gleich, $lte kleiner oder gleich.
// bezahlte Bestellungen ab 20
await orders.find({ status: 'paid', total: { $gte: 20 } }).toArray();Auch die Typen spielen eine Rolle: { $gte: '20' } vergleicht einen String, und MongoDB vergleicht niemals einen String mit einem Zahlenfeld. Alles in req.query ist ein String. Wandle Zahlen also mit Number() in Zahlen um, bevor sie in einen Filter gelangen.
Aufgabe
EinfachGET /books filtert anhand seiner Abfrage:
?author=gibt die Bücher dieses Autors zurück.?from=und?to=geben Bücher zurück, die in diesen Jahren veröffentlicht wurden, einschließlich beider Grenzen. Beide Parameter können auch einzeln verwendet werden.- Ohne Abfrage werden alle Bücher aufgelistet.
Sende GET /books?from=1960&to=1980, dann GET /books?from=1970.
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 wird { error: message } zurückgegeben.
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 list = await books.find().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');
});