הוספת מסמכים
חלק מהיחידה מסדי נתונים עם MongoDB במסלול ה-Node.js של Coddy. שיעור 5 מתוך 29.
לקוח שולח ספר חדש בגוף של בקשת POST, והשרת צריך לשמור אותו ולציין מה הוא שמר.
לכל מסמך יש שדה _id, המפתח הייחודי שלו באוסף. כשלאובייקט שמכניסים אין שדה כזה, insertOne יוצר אותו וגם כותב אותו לאותו אובייקט. הקריאה מחזירה רק את acknowledged ואת insertedId, ולא את המסמך. insertedId הוא ObjectId, סוג המזהה ש-MongoDB יוצרת. חיפוש לפי ObjectId מסביר זאת.
const movie = { title: 'Alien', year: 1979 };
const result = await movies.insertOne(movie);
console.log(result); // { acknowledged: true, insertedId: new ObjectId('66f1...') }
console.log(movie._id); // אותו idלכן, אחרי ההכנסה, האובייקט שהעברת הוא המסמך שנשמר, כולל _id: זה מה שהלקוח רוצה לקבל בחזרה.
קוד הפתיחה יוצר שלושה ספרים באמצעות insertMany, שמקבלת מערך של מסמכים. insertOne מקבלת מסמך אחד. שתיהן פעולות כתיבה אסינכרוניות.
אתגר
קללקוחות יכולים עכשיו להוסיף ספרים. שמרו את הספר שהלקוח שולח, ושלחו אותו בחזרה עם המזהה החדש שלו.
- ב־
server.js, מתחת ל־GET /books, הוסיפו נתיבPOST /books. - הנתיב שומר את גוף ה־JSON כמסמך חדש באוסף
books. - הוא מחזיר סטטוס 201 ואת הספר כפי שנשמר, כולל
_idש־MongoDB יצר. עבור הגוף שבנסו זאת, התגובה היא:הערך של{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }_idשלכם יהיה שונה. סדר השדות אינו משנה. נסו זאת: שלחוPOST /booksעם הגוף הזה:{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. תקבלו 201 ואת הספר עם_id. שלחוGET /books: תקבלו ארבעה ספרים, כאשר Beloved מופיע אחרון. בלשונית Data מוצגים ארבעה מסמכים ב־books. לחצו שוב על Run, ו־Beloved ייעלם. כל הרצה מתחילה עם מסד נתונים ריק, וקוד ההתחלה שומר שוב את אותם שלושה ספרים.
נסו בעצמכם
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.listen(3000, () => {
console.log('Bookshelf is running on port 3000');
});
כל השיעורים ביחידה מסדי נתונים עם MongoDB
תרגלו בעצמכם: Express אונליין