PracticU

שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose
מילון מושגים:
MongoDB - מסד נתונים מסוג NoSQL שמאחסן נתונים כמסמכים בפורמט דמוי JSON, בלי מבנה טבלאי קשיח.
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
סכמה - המבנה הלוגי של מסד נתונים: הגדרת הטבלאות, העמודות, הסוגים והקשרים ביניהם.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
JSON - פורמט טקסט קריא לייצוג נתונים מובְנים כזוגות מפתח-ערך, נפוץ להחלפת מידע בין שרת ללקוח.
REST - סגנון לבניית ממשקי API מעל HTTP, המבוסס על משאבים ועל שיטות סטנדרטיות כמו GET ו-POST.
Postman - כלי לבדיקת API: שליחת בקשות HTTP לשרת ובחינת התגובות, נפוץ בפיתוח ובבדיקות.

שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose
אחרי שבנינו ב-MongoDB שליפה של מוצרים יחד עם הקטגוריה שלהם בעזרת aggregate ו-lookup, ההרצאה מראה איך להעביר את אותה יכולת ל-Mongoose כך שתוגדר פעם אחת ברמת המודל ולא בכל פעם מחדש בלוגיקה.
השלבים העיקריים
1. הגדרה ברמת המודל: המטרה היא לא לחזור על הגדרת הקישור בכל שליפה של מוצרים עם קטגוריות, ולכן ההגדרה נכנסת למודל של המוצר.
2. הפיכת השדה לאובייקט: את categoryId שהיה מוגדר רק עם הטיפוס ObjectId הופכים לאובייקט, כדי שאפשר יהיה להוסיף לו עוד הגדרות. הטיפוס נשאר ב-type, ומוסיפים ref עם שם המודל Category, אותו שם שנתנו למודל בעת יצירתו.
3. שדה וירטואלי: במסד הנתונים למוצר יש רק categoryId, ולכן מגדירים בסכמה שדה וירטואלי בשם category בעזרת הפונקציה virtual. היא מקבלת את שם השדה ואובייקט הגדרות.
4. הגדרות השדה הווירטואלי: ref מצביע על המודל Category, localField הוא categoryId, foreignField הוא _id בקולקציית הקטגוריות, ו-justOne בערך true כדי לקבל אובייקט בודד ולא מערך, כמו ה-unwind שהיה קודם.
5. הגדרות המרה ל-JSON: מאשרים virtuals ב-toJSON, כדי ששדות וירטואליים יופיעו בתשובה של ה-RESTful service. את השדה id שמתווסף אוטומטית מכבים עם id: false, כי יש כבר _id.
6. שינוי הלוגיקה: הפונקציה getProductsIncludingCategory מצטמצמת לשורה אחת: find ואחריו populate של השדה category. populate הוא שממלא את השדות הווירטואליים.
7. בדיקה ב-Postman: לכל מוצר מופיע האובייקט של הקטגוריה שלו, למשל Beverages ו-Condiments.
שימו לב
אם מתקבלת שגיאה שהסכמה לא נרשמה (schema hasn't been registered), צריך לייבא את מודל הקטגוריה בקובץ הלוגיקה של המוצרים, גם אם לא משתמשים בו שם ישירות.
עכשיו אפשר להביא את כל המוצרים כשלכל מוצר מצורפת הקטגוריה שלו, וההרצאה הבאה עושה את הכיוון ההפוך.
השיעור הבא בקורס: שליפת קטגוריה עם כל המוצרים שלה ב-Mongoose

פרקי ההרצאה: שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose

  1. 00:00

    שליפה עם aggregate ו-lookup

  2. 00:56

    הגדרת הקשר ברמת המודל

  3. 01:33

    קישור categoryId למודל הקטגוריה

  4. 02:17

    הגדרת type ו-ref לשדה

  5. 02:57

    מהו virtual document

  6. 03:54

    יצירת virtual בסכמת המוצר

  7. 04:42

    הגדרת foreignField ו-justOne

תמלול ההרצאה: שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose

הטקסט המלא של הדקות הראשונות בהרצאה «שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

    אנחנו עכשיו רוצים להביא קטגוריה עם כל מוצר. זאת אומרת, יש לנו את הפונקציה הזאת שבנינו בעבר במונגו db, אנחנו רוצים להתאים אותה למונגוס.

  2. 00:17

    הפונקציה הזאת עשתה לנו משהו שנקרא aggregate, מעין join כזה. ואמרנו לה, לכי למוצרים, אבל תחפשי בבקשה, תעשי איזה לוקאפ, כל מוצר יש לו קטגוריה ID, אז מתוך טבלת הקטגוריות, תעשי קטגוריה שה-ID שלה שווה לקטגורי ה-ID שלנו, תביא לי גם את האובייקט

  3. 00:41

    הזה בתוך המוצר ותקראי לו פשוט קטגורי. את זה עשינו בשביל את ה-unwind הזה בכדי שהמערכת לא תיצור לנו מערך ותשים בו את הקטגוריה, אלא תעשה לי אובייקט בודד.

  4. 00:56

    אנחנו צריכים לעשות את זה, אבל ברמת המודל ולא ברמת הלוג'יק, כי אנחנו צריכים להגדיר את זה פעם אחת. זה הגיוני שכל פעם שנרצה מוצרים עם קטגוריות נצטרך להגדיר את כל ה-Connection הזה.

  5. 01:13

    אז מה שאנחנו עושים, אנחנו הולכים עכשיו ל-Product. אם נסתכל שנייה אחת על קטגורי, נראה שהמודל שלנו נקרא קטגורי, רשמנו את זה גם פה, זה השם של המודל שתיארנו למערכת.

  6. 01:29

    זאת הסיבה שאנחנו מתארים אותו כמחרוזת. הדבר הראשון שהוא שואל אותי זה מה המודל שלי, ה-Name של המודל. אוקיי, אז אני הולך לפרודקטס ואני עושה פה כמה שינויים.

  7. 01:42

    שינוי ראשון, אני צריך לומר לו שהcategory ID הזה בעצם מקושר למודל של הcategory. מה שאמרנו לכל אחד מהמאפיינים זה מה הסוג שלו, כלומר הטייפ שלו.

  8. 02:02

    אז הטייפ של הcategory ID הוא מונגוס חמא טייפס אובג'קט ID. בסדר. אבל אני רוצה לתת עוד הגדרות. אז אני הופך את זה לאובייקט יש לי פה פתיחה וסגירה ואני אומר לו שהמשתנה הזה ששמנו פה הvalue הזה זה הטייפ ואז אני יכול לתת לו עוד הגדרות כל אלה שאנחנו שמים פה הדיפולט שלהם זה שהם טייפ באובייקט

  9. 02:32

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

  10. 02:57

    מה שאנחנו צריכים לתת לו בנוסף זה הגדרה כזאת. אנחנו צריכים לגשת לפה ולהגיד לו את הדבר הבא. אנחנו צריכים לבנות משהו שנקרא virtual document, כי בדאטאבייס עצמו מוצר יש לו אך ורק את הקטגורי ID. אם אנחנו נסתכל על הדאטאבייס אנחנו נראה שלמוצר יש רק קטגורי ID. אנחנו רוצים להביא

  11. 03:35

    בנוסף גם מעין דוקיומנט נוסף שהוא הקטגורי. אז זה מתבצע במודל על ידי משהו שנקרא virtual document או virtual. זה מתבצע ברמת הסכמה. אנחנו הולכים לפרודקט סכמה וקוראים לפונקציה שנקראת virtual.

  12. 03:59

    הפונקציה הזאת מקבלת שם של השדה שהוא השדה הווירטואלי, זה הקטגורי, ומקבלת אובייקט שמתאר בעצם את כל הערכים שתיארנו פעם.

  13. 04:19

    בואו נחזור ונגיד כזה דבר. קודם כל אנחנו רפרנס לקטגורי ב'. ה-local field שלנו זה category ID. Foreign field שלנו, Foreign field שאנחנו מפנים אליו, זה בטבלת הקטגוריות ה-underline ID.

  14. 04:56

    ואנחנו לא רוצים מערך אלא אובייקט, זה ה-unwind שהיה לנו שמה, just one true.

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: יצירת מודל עבור קטגוריה ב-Mongoose

ההרצאה הבאה: שליפת קטגוריה עם כל המוצרים שלה ב-Mongoose

הרצאות קשורות מקורסים אחרים

  • וולידציה למספר מאפיינים יחד
  • התקפת NtlmRelayX יחד עם BloodHound.py - חלק 1
  • שליפת מידע עם Azios
  • מחזור חיים של פיתוח מוצר תוכנה

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React