טיפים לעבודה בmongodb חלק ראשון

עשיתם מהלך מדהים וזה במקום להשתמש בכלים "רגילים" הבנתם (אני מקווה) שמסד נתונים מבוסס מסמכים מתאים יותר עבור המשימה הספציפית שלכם (כלומר אם זה לא המצב, אז בבקשה תשקלו בשנית), והחלטתם כמוני ללכת לmongodb ליישם את זה.

אחד המקומות הראשונים שנופלים במונגו הוא בעדכון מידע (בחלק הבא אדבר על חיפוש מידע). ישנם כמה צורות לעדכון מידע. למשל השימוש ב save מול update אשר שניהם מבצעים את אותה הפעולה רק בגישות שונות. אבל יותר מזה, השימוש ב update לרוב בהתחלה אינו מבוצע נכון וגורם לתסכול רב (לפחות לי זה קרה).

ובכן בניגוד ל SQL, במונגו להוספת רשומה ועדכון רשומה אין צורך בתחביר מיוחד אלא בשימוש בפונקציות שהזכרתי למעלה. ההבדל הוא ש save פשוט שומר מידע, ואם הוא כבר קים הוא מעדכן מייד, בעוד ש update מעדכן בברירת מחדל אובייקט.

אבל ההבדל האמיתי הוא ש save מקבל אובייקט ומוסיף או מעדכן אותו כמו שהוא, בעוד ש update מקביל לפעולת where ב SQL, מאפשר לנו למצוא משהו לפני כן, ואם הוא נמצא מעדכן ואם הוא לא נמצא אנחנו יכולים להגיד לו בפרמטר של upsert להגיד לו להוסיף את הרשומה. כך שאנחנו חייבים גם להיזהר כאן כי במידה וחשוב לנו לעדכן רק כאשר המידע נמצא, ולא לעדכן אם הוא לא, אז פעולת where תתאים לנו, אבל רק אם נעבוד איתה נכון (קרי upsert יהיה false).

עוד פרט מאוד חשוב שיש במונגו שהוא נכון לא רק לעדכונים ותוספות, אבל גם, הוא השימוש בפונקציות ה $ (להבדיל מ$ המייצג מקום עליו לא אדבר עכשיו). הן עושות קיצור דרך לפעולות שבכל דרך אחרת היינו צריכים לעבוד קשה מאוד.

מה הכוונה ? ובכן נגיד ואנחנו רוצים לעדכן מסמך מסויים, אבל רק שדות ספציפיים, אז בברירת מחדל ב update נהיה צריכים לכתוב את מלוא האובייקט והמידע הקודם, אחרת הוא חושב בצדק שאנחנו רוצים לעדכן את המסמך בתוכן אחר (הרי אין חשיבות למבנה של המסמך כ"טבלה" כך שכל "רשומה" יכולה לשנות את כל המבנה שלה בכל זמן נתון), ולכן צריך להגיד לו שאנחנו רוצים לעדכן רק שדות מסויימים ואת זה נבצע באמצעות הפונקציה הבאה:

{ $set : { field : value, field2 : value }}

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

אם נרצה להוסיף (פעולה מתמטית לא פעולת הצבה) לערך מסוים ערך אחר (או לקבוע את הערך במידה והמידע לא קיים) נשתמש בפונקציה הבאה:

{ $inc : { field : 10 }}

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

בשביל להוסיף איבר למערך לדוגמא, נעשה שימוש בפונקציה הבאה:

{ $push : {field : 'baz'}}

זה יוסיף ל field שמכיל מערך את המחרוזת baz כאיבר נוסף. אבל אם נרצה להוסיף עוד תוכן של מערך אחר, אז נשתמש כבר ב $pushAll  (הדולר כמובן בהתחלה).

העניין הוא ש $push ו $pushAll מוסיפים לנו את המידע בלי לשאול שאלות. אם נרצה להוסיף רק מידע שלא קיים, אז נשתמש כבר ב$addToSet אשר יודע אם כל איבר במערך שאנחנו מספקים לו קיים או לא ובהתאם לזה יודע אם להוסיף אותו. זה יראה בצורה הבאה (לקוח מהתעוד של מונגו):

{ $addToSet : { a : { $each : [ 3 , 5 , 6 ] } } }

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

בהצלחה !

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s