שאילתות מורכבות

ראינו סינון בסיסי של רשומות, למשל השאילתא הבאה תתן לנו את הרשומות הדירוג שלהן הוא 7 בדיוק:

db.books.find({rating: 7})

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

אופרטורים

לאופרטורים ב-MongoDB יש סימן מקדים של $.

כך תראה פנייה לאופרטור גדול מ… התוצאה לא תכלול את התוצאה 7.

db.books.find({rating: {$gt: 7}})

נראה אופרטורים נוספים.

// גדול מ
db.books.find({rating: {$gt: 7}})

// קטן מ
db.books.find({rating: {$lt: 7}})

// קטן או שווה
db.books.find({rating: {$lte: 7}})

// מספר תנאים
db.books.find({rating: {$lte: 7}, author: "Jack Olive"})

// or
db.books.find({$or: [{rating: 7}, {rating: 9}]})
db.books.find({$or: [{pages: {$lt: 300}}, {pages: {$gt: 400}}]})

Using $in & $nin

נראה שני אופרטורים נוספים. אנחנו מחפשים ערך שהוא בתוך רשימת ערכים. נניח שאני רוצה את כל הספרים שיש להם דירוג של 7, 8 או 9. אפשר לעשות את זה עם אופרטור or, אבל מהיר וברור יותר להשתמש באופרטור in.

db.books.find({rating: {$in: [7, 8, 9]}})

אופרטור nin יתן תוצאה אם ערך אינו נמצא בתוך רשימת ערכים.

db.books.find({rating: {$nin: [7, 8]}})

Querying Arrays

עד עכשיו ראינו שאילתות על שדות עם ערך יחיד, נראה איך מבצעים שאילתא על ערך שנמצא במערך,למשל מערך genres שבדוגמא שמכיל מערך של מחרוזות.

db.books.find({genres: "fantasy"})

בגלל שאנחנו משתמשים במערך, MongoDB יחפש האם הערך נמצא במערך ולא האם זה הערך היחיד של השדה.

אפשר לבקש גם שהערך יהיה הערך היחיד של השדה כך:

db.books.find({genres: ["fantasy"]})

// שליחת רשימה מדוייקת של ערכים
db.books.find({genres: ["fantasy", "magic"]})

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

db.books.find({genres: {$all: ["fantasy", "magic"]}})

שאילתת רשומות מקוננות

ראינו רשומות מקוננות שבהם בתוך רשןמות הספר יש מערך רשומות של חוות דעת.

{
    "title": "Harry Potter",
    "author": "J. K. Rowling",
    "pages": 540,
    "genres": ["fantasy", "magic"],
    "rating": 9,
    "reviews": [
        {"name": "Billy", "body": "Great book"},
        {"name": "Betty", "body": "A must read"}
    ]
}

נניח שאני רוצה את כל הספרים שיש להם חוות דעת של Billy.

db.books.find({"reviews.name": "Billy"})