במאמר הקודם למדנו על שאילתות מורכבות יותר ב-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 – במיוחד בהשוואה למבנה נתונים רלוציוני.
תגובה אחת
פשתגן ולא פתשגן?