Menu
CoddyTech

הוספת מסמכים

חלק מהיחידה מסדי נתונים עם 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 מקבלת מסמך אחד. שתיהן פעולות כתיבה אסינכרוניות.

challenge icon

אתגר

קל

לקוחות יכולים עכשיו להוסיף ספרים. שמרו את הספר שהלקוח שולח, ושלחו אותו בחזרה עם המזהה החדש שלו.

  1. ב־server.js, מתחת ל־GET /books, הוסיפו נתיב POST /books.
  2. הנתיב שומר את גוף ה־JSON כמסמך חדש באוסף books.
  3. הוא מחזיר סטטוס 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 אונליין