מדריך MongoDB: עדכון נתונים

מדריך לעדכון documents ב-MongoDB

במאמר הקודם למדנו על שאילתות מורכבות יותר ב-MongoDB – איך לא רק לחפש documents עם ערך מסוים אלא לחפש טווח של ערכים או במגוון של ערכים – למשל "גם וגם" או "גם וגם ואו". במדריך הזה אני אסביר על עדכון נתונים ב-MongoDB.

עדכון הנתונים נעשה באמצעות מתודת update. המתודה עצמה מאוד פשוטה לשימוש, לפחות בהתחלה… אבל את זה אפשר לומר על כל דבר בתכנות. איך אנחנו מתחילים? ב-db. לא לשכוח שאנחנו צריכים לכתוב use test לפני שאנחנו מתחילים לעבוד על מסד נתונים ששמו הוא test. אחרי כן? ה-collection שלנו. אם אנחנו לא זוכרים מהו, show collections יראה לנו את כל ה-collections במסד הנתונים שלנו. ואחרי כן? update. במתודה הזו אנו צריכים להגדיר עבור מי אנחנו מכניסים את העדכון וגם באיזה עדכון מדובר.

באחד המדריכים הקודמים יצרתי collection ששמו הוא testData:


> db.testData.find()
{ "_id" : ObjectId("541d89baefb5139de0d37abe"), "name" : "ran" }
{ "_id" : ObjectId("541d9187efb5139de0d37abf"), "name" : "Omri" }
{ "_id" : ObjectId("541d9197efb5139de0d37ac0"), "name" : "Kfir" }
{ "_id" : ObjectId("541d9197efb5139de0d37ac1"), "name" : "Daniel" }
{ "_id" : ObjectId("541d9197efb5139de0d37ac2"), "name" : "Michal" }

נניח ואני רוצה לשנות את ה-document הראשון. איזה שינוי? מ-ran (אות קטנה) ל-Ran (אות גדולה). איך אעשה את זה? קודם כל: db.testData.update שמקבלת שני אובייקטים: item ו-set$. באובייקט item אני מגדיר את התנאים שאני רוצה עבור האובייקט וב-set אני מגדיר את השינוי. כך זה נראה:


db.testData.update({
    "name": "ran"
}, {
    $set: {
        "name": "Ran"
    }
})

אם אני אכניס את הפשתגן הזה, אני אגלה ש-ran השתנה ל-Ran. פשוט, לא? עכשיו בוא נסבך את זה עוד קצת. אנחנו יכולים, אם אנו רוצים, לבדוק אם יש ערך. אם כן – לעדכן ואם לא? אז לערוך ולשנות. איך עושים את זה? בדיוק ככה:


db.testData.update({
    "name": "Ran"
}, {
    "name": "ran"
}, {
    upsert: true
})

כאן אני מחפש ערך ששמו הוא: Ran, אם אני אמצא, אז אני אעדכן אותו ל-ran. אם לא, אני אכניס אותו.

אם אני רוצה לעדכן יותר מערך אחד, אין דבר פשוט מזה – כל מה שאני צריך לעשות זה פשוט להוסיף multi: true לעדכון רגיל. למשל:


db.testData.update({"name":/a/},{$set:{"name":"name with a"}},{multi: true})

מה הולך פה? מאוד פשוט – שימוש ב-update. התנאי הראשון הוא תנאי כמו כל תנאי אחר, אבל אני יודע שהוא יחזיר לי כמה תוצאות, ה-set$ הוא אותו אחד שראינו כמה דוגמאות למעלה. במקרה הזה הוא פשוט יחליף את השמות שעונים לתנאי הראשון (יש בהם a) למחרוזת כלשהי. מה שמיוחד הוא שהכנסתי multi:true וזה הכל – במקום לעדכן רק document אחד (אפילו עם יש מיליארד שעונים על התנאים) הוא יעדכן כל document שעונה על התנאי.

ואם אנחנו רוצים למחוק נתונים? אין פשוט מזה – אנו נשתמש ב-remove


> db.testData.remove({"name":/a/})


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


db.testData.remove({"name":/a/},true)

אם אני רוצה למחוק את כל ה-documents שיש לי ב-collection, אני פשוט אעביר אובייקט ריק:


db.testData.remove({})

ועל מנת להפטר לחלוטין מה-collection, כך שאפילו כשאחפש את ה-collection באמצעות show collections אני לא אראה דבר, כל מה שעלי לעשות זה להשתמש ב:


db.testData.drop()

עד כאן בנוגע לעדכון! במדריך הבא נצלול מעט יותר עמוק ונדבר על מודל נתונים נכון ל-MongoDB – במיוחד בהשוואה למבנה נתונים רלוציוני.

פוסטים נוספים שכדאי לקרוא

תמונה מצוירת של רובוט שמנקה HTML
יסודות בתכנות

סניטציה – למה זה חשוב

הסבר על טכניקה פשוטה וידועה מאד שאנו מפעילים על מידע לפני שאנחנו מציגים אותו ב-HTML באפליקציה או באתר.

תמונת תצוגה של מנעול על מחשב
פתרונות ומאמרים על פיתוח אינטרנט

הגנה מפני XSS עם Trusted Types

תכונה ב-CSP שמאפשרת מניעה כמעט הרמטית להתקפות XSS שכל מפתח ווב צריך להכיר וכדאי שיכיר.

תמונה של הבית הלבן עם מחשוב ענן וטקסט: FEDRAMP
פתרונות ומאמרים על פיתוח אינטרנט

FedRAMP & FIPS מבוא למתחילים

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

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

גלילה לראש העמוד