שימוש בשאילתות גיאוגרפיות

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

לפני שמתחילים

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

  2. מוודאים שיש לכם לפחות אינדקס 2dsphere אחד, או יוצרים אינדקס 2dsphere.

אובייקטים של GeoJSON

כדי להריץ שאילתה גיאו-מרחבית על שדות באוסף, השדות שאתם שולחים לגביהם שאילתה צריכים להיות אובייקטים של GeoJSON או GeoPoints.

אפשר לבצע שאילתת מיקום גיאוגרפי באמצעות האופרטור $near, שמחשב את המרחק של נקודה גיאוגרפית ביחס לנקודות גיאוגרפיות במסמכים. המסמכים האלה ממוינים לפי המרחק הקרוב ביותר למרחק הרחוק ביותר בתוצאות השאילתה. אפשר גם לשנות את סדר המיון הזה על ידי הגדרת מיון משני, שאינו $natural, בשאילתה. האופרטור $near חייב להופיע בשדה של מסמך במסנן השאילתה, והוא חייב להכיל שדה GeoJSON‏ $geometry.

בדוגמה הבאה, האופרטור $near משמש לחישוב המרחק בין הנקודה הגיאוגרפית (-122.084, 37.4221) לבין הנקודות הגיאוגרפיות שנמצאות בשדה location של כל המסמכים ב-myCollection.. המסמכים מוחזרים וממוינים לפי המרחק הקרוב ביותר לנקודה הגיאוגרפית.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

אפשר גם להשתמש בשדות האופציונליים $maxDistance ו-$minDistance כדי לקבוע את המרחק במטרים מנקודת השאילתה. בדוגמה הבאה מוצגת שאילתה שבה המסמכים שמוחזרים צריכים להיות במרחק של 500 מטרים לפחות ו-2,000 מטרים לכל היותר מהנקודה (-122.084, 37.4221):

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

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

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

הערך של המחיצה חייב להיות מחרוזת. צריך לצרף את מסנן המחיצה לשאילתת החיפוש באמצעות האופרטור $and.

מגבלות

  • אי אפשר להשתמש באופרטורים $near ובאופרטורים $text באותה שאילתה.
  • אי אפשר להציב רכיב בתוך רכיב ב-$near בתוך הצהרת $or עם כמה פסוקיות, אלא אם $near הוא הביטוי היחיד בפסוקית $or.
  • אי אפשר להשתמש ב-$near עם האופרטורים $not או $nor בשאילתה.
  • אי אפשר להשתמש ב-$near בשאילתות אגרגציה.