מדריך MongoDB : שליפת נתונים

שליפת נתונים בסיסית ב-MongoDB באמצעות מתודת find

במאמר הקודם יצרנו db, collection ואפילו document. ראינו איך כל document בעצם מורכב מאובייקט JSON ושצריך ליצור אותו לפני שמכניסים אותו. קל ליצור document, נשאלת השאלה איך שולפים מידע?

מבנה השאילתה הבסיסי הוא find. לא לשכוח שאני צריך "להשתמש" במסד הנתונים שלי – כלומר אני מניח שעשיתם use test (אם test הוא מסד הנתונים שלכם). אחרי זה אני כותב את שם ה-collection שלי. שכחתי את שם ה-collection? שימוש ב-show collections יראה לי את כל ה-collections שלי. find הוא המתודה שבה אנו משתמשים. אם אנו לא מכניסים שום ארגומנט אז בעצם אנו מבקשים לעשות שאילתה כללית שתחזיר לנו הכל – די דומה ל SELECT * המוכר לנו.

מתבלבלים? הקלידו


 db.testData.find()

השורה הזו תחזיר לי את כל ה-documents ב-collection ששמו הוא testData. משהו בסגנון הזה:


{ "_id" : ObjectId("541d89baefb5139de0d37abe"), "name" : "ran" }

רגע אחד! מה זה id_? אנחנו לא הכנסנו שום id_ כשיצרנו את ה-document הזה, לא? אז מאיפה הוא צץ? MongoDB מכניס אותו באופן אוטומטי. נדבר עליו בהמשך אבל לא להבהל כשרואים אותו.

אם נכניס עוד נתונים, אז אנו נראה את כולם כשנחפש find. בואו נתאמן! השאילתה הבאה מכניסה כמה documents עם שמות ל-collection ששמו הוא testData:


db.testData.insert([{"name":"Omri"},{"name":"Kfir"},{"name":"Daniel"},{"name":"Michal"}])


אלו מכם שמכירים JSON ו-JavaScript לא יתבלבלו למראה הסינטקס – פשוט אוסף של אובייקטים שנכנסים כארגומנט למתודת insert. מי שזה נראה לו מסובך שיסתכל מעט על הקוד ויבין – במקום להכניס את האובייקט לתוך משתנה ואז את המשתנה לתוך מתודת insert כמו במאמר הקודם, פשוט יצרתי כמה אובייקטים ויאללה לתוך ה-insert. מסד הנתונים שלנו עכשיו נראה כך:


> 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" }

נניח ואני רוצה לחפש את המשתמש ששמו הוא Kfir? כל מה שאני צריך זה להעביר ב-find אובייקט עם מה שאני רוצה לקבל. למשל אם אני רוצה לקבל את כל האובייקטים שהשם שלהם הוא Kfir אני אחפש:


db.testData.find({"name" : "Kfir"})

במקרה הזה אני אקבל תוצאה אחת כמובן.

אפשר להכניס כארגומנט למתודת ה-find גם דברים יותר מתוחכמים. למשל – אני רוצה לקבל את כל השמות שיש בהם r. ב-MySQL יש לנו את הפקודה LIKE. ב-MongoDB אנו יכולים להכניס ביטויים רגולריים – למשל:


db.testData.find({name : /r/})

יחזיר לי את כל ה-documents שיש בהם את המילה 'r'. אם אני רוצה את כל השמות שמתחילים ב-r


db.testData.find({name : /^r/})


ואם אני רוצה את השמות שנגמרים ב-r


> db.testData.find({name : /r$/})

כמובן שאפשר להכניס ביטויים יותר ארוכים ממילה אחת. אבל כמובן שאפשר לחפש גם דברים שהם יותר מורכבים מ-LIKE. בדיוק כמו ב-MySQL.

בואו וניצור collection קצת יותר מוצלח. כאמור ה-shell של MongoDB מתנהג בדיוק כמו JavaScript. כלומר אני יכול להגדיר שם פונקציות. בואו ונגדיר פונקציה שיוצרת מחרוזות טקסט רנדומליות:


function randomString() {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var randomstring = '';
    var string_length = 100 + Math.floor(Math.random() * 200);
    for (var i = 0; i < string_length; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum, rnum + 1);
    }
    return randomstring;
}

את כל זה (כן, כן) תעתיקו ותדביקו בקונסולה. מהנקודה הזו, לפחות עד שתצאו, תוכלו לקרוא לפונקציה randomString. עכשיו בואו וניצור collection ששמו הוא clients באופן הבא:


for (var i = 0; i < 100; i++) {
    db.clients.insert({
        x: i,
        name: randomString(),
        value: _rand() * 100
    });
}

למי שיודע JavaScript, זה מאוד פשוט – לולאה פשוטה שפשוט יוצרת document שיש לו x, יש לו name ויש לו value. הרצה של הדבר הזה מניבה לי collection ששמו הוא clients ומכיל מאה documents – משהו בסגנון הזה:


{ "_id" : ObjectId("541d9aee784269c2e9f3c092"), "x" : 17, "name" : "gIZxF4ALvwiMMtvtZC8G6ExsmxQum8KFAQws4z6un9nMrol8QCCue7T7rCLVvnNM0dfVzW3VKZgEeS5PLKA6RNI7lZbWT1ySl8v1xb77nmCasF3I8Vr5Vu3Bqa0uDv8umXkbreihE1DXl2OrudxEmUPMf0PKSdQhHe5zqqQ90LOBBwd6lNBGhmeLkI1ramDC4i7JnnfmTrX8v61e", "value" : 34.991921903565526 }
{ "_id" : ObjectId("541d9aee784269c2e9f3c093"), "x" : 18, "name" : "e683H4QlB2sHLGUtvnftDpWQTJJgZ2Ev92TRTEK5oiCbLxsz2d5tS0hx4fKZqzfITMrtlDJkI4R2RRMhvT4wngOulcTnb9t8SnfDytSIplJUhly", "value" : 25.878882687538862 }
{ "_id" : ObjectId("541d9aee784269c2e9f3c094"), "x" : 19, "name" : "HIIWTKsT8guLtyMkgf3KVmCzJNUviArxVT9GaT4vI3Bkg3AZLWzMoMGVynoQz1qp0elVk0oyxdx7fUUFFRWNRtUJipf95WhKGQu3UDkRb2XFigmuhGnVc5WNbCg1w", "value" : 96.42805075272918 }

עכשיו, על זה אפשר להתאמן בשאילתות. נניח ואני רוצה לקבל את כל אלו שה-value שלהם גדול מ-95, איך אני אעשה את זה? באמצעות מתודת find מה-collection שלי, את זה אתם כבר אמורים לדעת – אבל איזה ארגומנט היא צריכה לקבל? איך יראה האובייקט? אז ככה:


db.clients.find({value: {$gt:95}})

ה-gt הוא greater than ובו אנו משתמשים – במקרה הזה כל מי שיש לו value שגדול מ-95.

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

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