مرشحات الاستعلام
جزء من قسم قواعد البيانات باستخدام 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() قبل إضافتها إلى مرشّح.
التحدي
سهليُصفّي 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
1المستندات
الاتصال بـ MongoDBإدراج المستندات