חיפוש לפי ObjectId
חלק מהיחידה מסדי נתונים עם MongoDB במסלול ה-Node.js של Coddy. שיעור 7 מתוך 29.
כדי לקבל ספר אחד, השרת מחפש אותו לפי _id, אבל המזהה מגיע בכתובת ה-URL כטקסט.
_id ש-MongoDB יוצר הוא ObjectId: ערך של 12 בתים שנכתב באמצעות 24 תווים הקסדצימליים: הספרות 0 עד 9 והאותיות a עד f. ב-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'); // falsefindOne מחזירה את המסמך הראשון שתואם, או null כשאין התאמה.
אתגר
קלהשלב הזה פותח את פרויקט ה-API של מדף הספרים שהוכן עבור הקורס, ולא את קובצי הפרויקט שלך מתוך הוספת מסמכים (כולל server.js). העבודה הקודמת שלך נשארת בשיעור משלה. קרא את הקבצים שסופקו לפני עריכת server.js. העותק הזה מכיל את הנתיבים להצגת רשימת הספרים ולהוספת ספרים.
לקוח רוצה ספר אחד, שנבחר לפי _id שלו.
- ב-
server.js, הוסף נתיבGET /books/:id. - המזהה בכתובת ה-URL הוא טקסט. יש טקסטים שלעולם לא יכולים להיות ObjectId, שאורכו 24 תווים המורכבים מספרות ומהאותיות a עד f. עבור טקסט כזה, החזר סטטוס 400 ושגיאה, באמצעות
sendError, למשל{ "error": "Not a valid id" }. בדוק זאת לפני יצירת ObjectId, כי יצירת אחד מטקסט לא תקין גורמת לשגיאה. - אחרת, חפש את הספר לפי
_idשלו. כשתמצא אותו, החזר סטטוס 200 ואת הספר:{ "_id": "6720a1f4c2b9e81d3a5f0c11", "title": "Dune", "author": "Frank Herbert", "year": 1965, "isbn": "9780441013593", "genre": "scifi" }. - אם אין ספר עם
_idהזה, החזר סטטוס 404 ושגיאה, למשל{ "error": "No such book" }. נסה זאת: שלחGET /booksוהעתק את_idשל Dune: 24 התווים שאחרי"_id":. בכל הפעלה הספרים מקבלים מזהים חדשים, לכן העתק אותו שוב אחרי כל הפעלה. שלחGET /books/ואחריו המזהה שהעתקת: תקבל 200 ואת Dune. שלחGET /books/42: תקבל 400. שלחGET /books/000000000000000000000000: זהו מזהה תקין שאין לאף ספר, ולכן תקבל 404.
נסו בעצמכם
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');
});
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה מסדי נתונים עם MongoDB
תרגלו בעצמכם: Express אונליין