Abfragefilter
Teil des Abschnitts Datenbanken mit MongoDB der Node.js-Journey von Coddy. Lektion 9 von 29.
Ein Client möchte oft nur einige 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 vergleicht: $gte bedeutet größer oder gleich, $lte kleiner oder gleich. Zwei Operatoren für dasselbe Feld verwenden ein gemeinsames Objekt: { total: { $gte: 20, $lte: 50 } } lässt die Summen von 20 bis 50 durch.
// 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 daher mit Number() in Zahlen um, bevor du sie in einen Filter einsetzt.
Aufgabe
EinfachDieser Schritt öffnet das vorbereitete Bücherregal-API-Projekt des Kurses und nicht deine Projektdateien aus Suche nach ObjectId (einschließlich server.js). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du server.js bearbeitest. Diese Kopie enthält die Routen zum Einfügen von Büchern ins Bücherregal und zum Nachschlagen anhand der ObjectId.
Clients möchten nur bestimmte Bücher: die Bücher eines Autors oder die Bücher aus bestimmten Jahren. Lass die Datenbank sie auswählen.
- Ändere in
server.jsGET /books. Erstelle ein Filterobjekt aus der Abfragezeichenfolge und übergib es anfind. Die Route antwortet weiterhin mit einem JSON-Array von Büchern. ?author=Jane%20Austengibt nur die Bücher zurück, derenauthorgenauJane Austenist. (%20ist die Schreibweise eines Leerzeichens in einer URL.)?from=1960gibt die Bücher mit einemyearvon 1960 oder später zurück.?to=1980gibt die Bücher von 1980 oder früher zurück. Bei beiden muss ein Buch zwischen den beiden Jahren liegen; die Jahre selbst zählen mit. Jede der beiden Angaben kann auch allein verwendet werden.- Abfragewerte kommen immer als Zeichenfolgen an, aber die gespeicherten Jahre sind Zahlen. Wandle
fromundtoin Zahlen um, bevor sie in den Filter gelangen, sonst gibt es keine Treffer. - Ohne Abfrage gibt die Route wie zuvor alle Bücher zurück. Probiere es aus: Sende
GET /books?from=1960&to=1980: Du erhältst Dune (1965) und Kindred (1979). SendeGET /books?from=1970: Du erhältst nur Kindred. SendeGET /books?to=1900: Du erhältst nur Emma (1815). SendeGET /books?author=Jane%20Austen: Du erhältst nur Emma. SendeGET /books: Du erhältst alle drei.
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 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');
});
Alle Lektionen in Datenbanken mit MongoDB
1Dokumente
Ein Buch als DokumentSammlungen und DatenbankenVerbindung zu MongoDB herstellenGespeicherte Dokumente lesenDokumente einfügenEin Dokument findenÜber ObjectId suchenZahlen vergleichenAbfragefilterZurückgegebene Felder auswählenAbfrageergebnisse sortierenDie ersten Ergebnisse behaltenProjektion, Sortierung und LimitÜbe selbstständig: Express-Playground