Menu
CoddyTech

מסנני שאילתה

חלק מהיחידה מסדי נתונים עם MongoDB במסלול ה-Node.js של Coddy. שיעור 4 מתוך 18.

לקוח רוצה לעיתים קרובות רק חלק מהספרים, ובסיס הנתונים יכול לבחור אותם.

האובייקט שמעבירים אל find הוא מסנן: מסמך תואם כאשר כל השדות במסנן תואמים. ערך רגיל פירושו שווה. אופרטור הוא מפתח שמתחיל ב־$ ומשווה במקום זאת: $gte פירושו גדול או שווה, $lte פירושו קטן או שווה.

// הזמנות ששולמו בסכום של 20 ומעלה
await orders.find({ status: 'paid', total: { $gte: 20 } }).toArray();

לסוגי הנתונים יש חשיבות: { $gte: '20' } משווה מחרוזת, ו־MongoDB לעולם לא תואם מחרוזת לשדה מספרי. כל מה שנמצא ב־req.query הוא מחרוזת, לכן יש להמיר מספרים למספרים באמצעות Number() לפני שמכניסים אותם למסנן.

challenge icon

אתגר

קל

GET /books מסנן לפי השאילתה שלו:

  • ?author= משאיר את הספרים של אותו מחבר.
  • ?from= ו-?to= משאירים ספרים שפורסמו בשנים האלה, כולל שני הקצוות. אפשר להשתמש בכל אחד מהם בנפרד.
  • ללא שאילתה, מוצגים כל הספרים.

שלחו GET /books?from=1960&to=1980, ואז GET /books?from=1970.

נסו בעצמכם

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

// כל שגיאה מחזירה { 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');
});

כל השיעורים ביחידה מסדי נתונים עם MongoDB