מדריך 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 – במיוחד בהשוואה למבנה נתונים רלוציוני.

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

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

רינדור של קליינט סייד עם SSR

הסבר קצר על SSR מול רינדור קלאסי ולא. לא תמיד זה טוב להשתמש בו. אין כדור כסף שיכול לפתור הכל.

עבודה בהיי טק

איך מראיינים סניורים?

השיטה שלי לבדיקת התאמה טכנית למתכנתות ולמתכנתים בכירים עם כמה שנות ניסיון.

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

נגישות טכנית – פודקאסט ומבוא

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

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