קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
ראשי ♦ Javascript ♦ איך לשמור או לעדכן מערך של אובייקטים ב-mongoDb בשימוש nodeJs Express

איך לשמור או לעדכן מערך של אובייקטים ב-mongoDb בשימוש nodeJs Express

עידן יצחקי 25 בדצמבר 2021 אין תגובות

בהנחה שיש למשתמש דף עם טופס, בטופס המשתמה יכול להוסיף אין סוף תיבות טקסט ו/או לעדכן קיימת.

לאחר שהוא סיים, ללחץ על שמור ולשלוח את כל המידע לשרת.

זה שם אותנו במצב שהשרת שלנו קיבל מערך של אובייקטים שחלקם מחזיקים ב-ID (כל השורות שהגיעו מהשרת) ואותם אנחנו צריכים לעדכן.

חוץ מהם, יגיעו גם אובייקטים ללא ID (החדשים שהמשתמש יצר) ואותם רוצים להוסיף לבסיס נתונים.

זה אומר שאנחנו צריכים לרוץ בלולאה על המערך ולשמור או לעדכן את השורות ובסוף לשלוח אם התהליך הסתיים בהצלחה או לא.

למי שיצא לעבוד בעבר עם NODEJS+MONGODB שם לב שיש insertMany ויש updateMany.

לצערנו הם לא עושים פעולות דומות:

  • insertMany – יכול לקחת מערך של אובייקטים ולשמור אותם בפעולה אחת בבסיס הנתונים.
  • updateMany – מעדכן את אותו ערך לכל הרשומות בבסיס הנתונים שעונות פילטר שניתן לו.

אם נשתמש ב-updateOne ונרוץ בלולאה, לא נדע מתי להחזיר תשובה חזרה כשהפעולה בוצעה.

שמירה ב-DB היא פעולה async והלולאה שלנו לא, לכן אם נרוץ בלולאה זה לא יעבוד לנו כמו שאנחנו מצפים,

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

פיתרון שמצאתי לבעיה הזאת נראה כך:

exports.updateExternalLinks = async (req, res, next) => {
    Promise.all(req.body.links.map(async (item) => {
        if (item.id) {
            await ExternalLinks.updateOne({ _id: item.id }, item);
        }
        else {
            item.creator = req.userData.userId;
            await ExternalLinks.insertMany(item);
        }
    })).then(() => {
        res.status(200).json({
            message: 'Update completed'
        });
    }).catch(() => {
        res.status(500).json({
            message: 'Update failed'
        });
    });
}
  • שורה 1 – תמיד רעיון טוב לעבוד async כדי לא לתפוס משאבים אלא להשתמש בהם רק שצריך.
  • שורה 2 – זה מה שעושה את הקסם שאנחנו צריכים, promise.all ממתין לכל התשובות ומנסה להערך האם הפעולה עברה תקין או שחלק מהתשובות חזרו עם שגיאה.

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

בנוסף, ניתן לראות שה-map מפעיל פונקציות שהם בהגדרה async, כדי שהם ישלחו לבסיס הנתונים ויטופלו בתורם ואנחנו נוכל להשתמש ב-await כדי להמתין לתשובה מהבקשה.

  • שורה 3 – בשורה זו בודקים ומבדילים בין השורות שצריך לעדכן ואלו שצריך להוסיף לבסיס הנתונים.

הבדיקה היא על הזיהוי של האובייקט, כך שאם יש זיהוי זה אומר שבהכרח הוא הגיע וקיים ב-DB ואם הזיהוי ריק אז הוא חדש ולא הגיע מה-DB.

  • שורה 7 – כחלק מהמודל של האובייקט, הוגדר creator (אפשר להשתמש בכל שם שרוצים) והוא מתפקד כזיהוי ושיוך למשתמש הספציפי. אם נשווה אותו ל-SQL אז הוא FK, זאת אומרת, שהוא מחזיק את ה-ID של המשתמש (PK).
  • שורה 10 ועד הסוף – מופעל לאחר שה-promise מוציא את הסטטוס, במידה שהסטטוס שגיאה אז אנחנו שולחים למשתמש סטטוס 500 והודעה שהעדכון נכשל, אחרת אנחנו מחזירים תשובה שהעדכון הצליח.

פוסטים קשורים:

קורס חינם React & GraphQL – שיעור שלישי – צד שרת Nodejs של המשחק איקס עיגול.קורס חינם React & GraphQL – שיעור שלישי – צד שרת Nodejs של המשחק איקס עיגול. תמונת אווירה של תקשורתפונקצית קריאה מ-JS ל-API בסיסית (XMLHttpRequest) שימוש יעיל ב async pipe – אנגולר תמונת אווירה חצים לשינויהמרה של אקסל למערך וממערך חזרה לאקסל בעזרת JS
express javascript mongodb nodejs

אודות המחבר

עידן יצחקי להציג את כל הפוסטים של עידן יצחקי


« פוסט קודם
פוסט הבא »

השארת תגובה

ביטול

חיפוש באתר
בחירת העורכים
29 בדצמבר 2023 עידן יצחקי

שדה טקסט עשיר עם תמונות

אתם הולכים להיות מופתעים עד כמה HTML יכול להיות חכם ולבצע משהו כל כך מורכב, שאם אנחנו היינו רוצים ליצור

1 באוקטובר 2021 עידן יצחקי

איך למשוך דינמית favicon של אתרים אחרים ב-JS

בפוסט זה נראה איך אפשר על פי לינקים בדף למשוך את ה-favicon מהדומיין שלהם באופן דינמי, בדיקה של תקינות התמונה

פופולרי
Javascript functions – היכרות עם סוגי פונקציות
Javascript
21 בדצמבר 2024 אין תגובות
Nested routing in angular standalone component
Typescript
15 בנובמבר 2024 תגובה אחת
בחרו לפי תגיות
angular blockchain css ethers express front-end fullstack GQL html javascript next js nextjs nodejs react hooks reactjs solidity webgl אנגולר בלוקציין וורדפרס לימודי אנגולר לימודי וורדפרס לימוד ריאקט מדריך front-end מדריך GQL מדריך אנגולר מדריך וורדפרס מדריך חינם react מדריך ריאקט מפתח בלוק מפתח בלוקציין מתכנת front-end מתכנת בלוקציין מתכנת פרונט סולידיטי קורס front end קורס fullstack קורס nextjs קורס אנגולר קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי קורס ריאקט קורס תכנות קורס תכנות בחינם
סינון על פי קטגוריות
CSS fullstack HTML IIS Javascript nodeJs SEO Typescript אנגולר בלוקציין בניית אתרים וורדפרס חיפוש עבודה כלים נוספים כללי נגישות קורסים ריאקט תלת מימד תקלות ופתרונות
צור קשר
כל הזכויות שמורות לקודקודייל
ליצירת קשר: @ קודקודייל
גלילה לראש העמוד