Menu
CoddyTech

البحث باستخدام ObjectId

جزء من قسم قواعد البيانات باستخدام MongoDB في رحلة Node.js على Coddy. الدرس 3 من 18.

للعثور على كتاب واحد، يبحث الخادم عنه باستخدام _id، لكن المعرّف يصل في عنوان URL كنص.

القيمة _id التي ينشئها MongoDB هي ObjectId: قيمة من 12 بايتًا تُكتب على هيئة 24 محرفًا سداسيًا عشريًا. يعرضها JSON كسلسلة نصية، لكنها ليست كذلك في قاعدة البيانات، لذا فإن المرشّح الذي يستخدم النص العادي لا يعثر على أي شيء. حوّل النص إلى ObjectId أولًا. تتحقق ObjectId.isValid مما إذا كان بالإمكان تحويل نص إلى قيمة كهذه، لأن new ObjectId يطلق استثناءً عند تمرير أي قيمة أخرى.

import { ObjectId } from 'mongodb';

const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // الطلب، أو null
await orders.findOne({ _id: text });               // null: text ليس ObjectId
ObjectId.isValid('42');                            // false

تعيد findOne أول مستند مطابق، أو null عندما لا يوجد أي تطابق.

challenge icon

التحدي

سهل
  • يعرض GET /books/:id الكتاب الذي يحمل ذلك _id.
  • المعرّف الذي ليس من نوع ObjectId يعرض 400.
  • المعرّف الصالح الذي لا يقابله أي كتاب يعرض 404.

انسخ _id من GET /books وأرسل GET /books/<id>. ثم أرسل GET /books/42.

جرّب بنفسك

import express from 'express';
import { MongoClient } 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.listen(3000, () => {
    console.log('Bookshelf is running on port 3000');
});
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس قواعد البيانات باستخدام MongoDB