
categoryId שהיה מוגדר רק עם הטיפוס ObjectId הופכים לאובייקט, כדי שאפשר יהיה להוסיף לו עוד הגדרות. הטיפוס נשאר ב-type, ומוסיפים ref עם שם המודל Category, אותו שם שנתנו למודל בעת יצירתו.categoryId, ולכן מגדירים בסכמה שדה וירטואלי בשם category בעזרת הפונקציה virtual. היא מקבלת את שם השדה ואובייקט הגדרות.ref מצביע על המודל Category, localField הוא categoryId, foreignField הוא _id בקולקציית הקטגוריות, ו-justOne בערך true כדי לקבל אובייקט בודד ולא מערך, כמו ה-unwind שהיה קודם.virtuals ב-toJSON, כדי ששדות וירטואליים יופיעו בתשובה של ה-RESTful service. את השדה id שמתווסף אוטומטית מכבים עם id: false, כי יש כבר _id.getProductsIncludingCategory מצטמצמת לשורה אחת: find ואחריו populate של השדה category. populate הוא שממלא את השדות הווירטואליים.הטקסט המלא של הדקות הראשונות בהרצאה «שליפת מוצר יחד עם הקטגוריה שלו ב-Mongoose» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו עכשיו רוצים להביא קטגוריה עם כל מוצר. זאת אומרת, יש לנו את הפונקציה הזאת שבנינו בעבר במונגו db, אנחנו רוצים להתאים אותה למונגוס.
הפונקציה הזאת עשתה לנו משהו שנקרא aggregate, מעין join כזה. ואמרנו לה, לכי למוצרים, אבל תחפשי בבקשה, תעשי איזה לוקאפ, כל מוצר יש לו קטגוריה ID, אז מתוך טבלת הקטגוריות, תעשי קטגוריה שה-ID שלה שווה לקטגורי ה-ID שלנו, תביא לי גם את האובייקט
הזה בתוך המוצר ותקראי לו פשוט קטגורי. את זה עשינו בשביל את ה-unwind הזה בכדי שהמערכת לא תיצור לנו מערך ותשים בו את הקטגוריה, אלא תעשה לי אובייקט בודד.
אנחנו צריכים לעשות את זה, אבל ברמת המודל ולא ברמת הלוג'יק, כי אנחנו צריכים להגדיר את זה פעם אחת. זה הגיוני שכל פעם שנרצה מוצרים עם קטגוריות נצטרך להגדיר את כל ה-Connection הזה.
אז מה שאנחנו עושים, אנחנו הולכים עכשיו ל-Product. אם נסתכל שנייה אחת על קטגורי, נראה שהמודל שלנו נקרא קטגורי, רשמנו את זה גם פה, זה השם של המודל שתיארנו למערכת.
זאת הסיבה שאנחנו מתארים אותו כמחרוזת. הדבר הראשון שהוא שואל אותי זה מה המודל שלי, ה-Name של המודל. אוקיי, אז אני הולך לפרודקטס ואני עושה פה כמה שינויים.
שינוי ראשון, אני צריך לומר לו שהcategory ID הזה בעצם מקושר למודל של הcategory. מה שאמרנו לכל אחד מהמאפיינים זה מה הסוג שלו, כלומר הטייפ שלו.
אז הטייפ של הcategory ID הוא מונגוס חמא טייפס אובג'קט ID. בסדר. אבל אני רוצה לתת עוד הגדרות. אז אני הופך את זה לאובייקט יש לי פה פתיחה וסגירה ואני אומר לו שהמשתנה הזה ששמנו פה הvalue הזה זה הטייפ ואז אני יכול לתת לו עוד הגדרות כל אלה שאנחנו שמים פה הדיפולט שלהם זה שהם טייפ באובייקט
כאילו בכל אחד יכלנו להגיד לו טייפ זה סטרינג אבל אם יש לי אחד ויחיד אז זה מיותר זה כבר הטייפ אז אמרתי לו שהטייפ זה האובג'קט איידי ועכשיו אני אומר לו, תשמע, אתה רפרנס למודל שנקרא קטגורי, אבל זה לא מספיק.
מה שאנחנו צריכים לתת לו בנוסף זה הגדרה כזאת. אנחנו צריכים לגשת לפה ולהגיד לו את הדבר הבא. אנחנו צריכים לבנות משהו שנקרא virtual document, כי בדאטאבייס עצמו מוצר יש לו אך ורק את הקטגורי ID. אם אנחנו נסתכל על הדאטאבייס אנחנו נראה שלמוצר יש רק קטגורי ID. אנחנו רוצים להביא
בנוסף גם מעין דוקיומנט נוסף שהוא הקטגורי. אז זה מתבצע במודל על ידי משהו שנקרא virtual document או virtual. זה מתבצע ברמת הסכמה. אנחנו הולכים לפרודקט סכמה וקוראים לפונקציה שנקראת virtual.
הפונקציה הזאת מקבלת שם של השדה שהוא השדה הווירטואלי, זה הקטגורי, ומקבלת אובייקט שמתאר בעצם את כל הערכים שתיארנו פעם.
בואו נחזור ונגיד כזה דבר. קודם כל אנחנו רפרנס לקטגורי ב'. ה-local field שלנו זה category ID. Foreign field שלנו, Foreign field שאנחנו מפנים אליו, זה בטבלת הקטגוריות ה-underline ID.
ואנחנו לא רוצים מערך אלא אובייקט, זה ה-unwind שהיה לנו שמה, just one true.