אפשר להשתמש בשאילתות גיאו-מרחביות בפעולות שתואמות ל-MongoDB כדי לשלוח שאילתות למסמכים שנמצאים בטווח מסוים מקו אורך וקו רוחב ספציפיים.
לפני שמתחילים
מוודאים שיש לכם גישה למסד נתונים קיים של פעולות שתואם ל-MongoDB, או יוצרים מסד נתונים ומתחברים אליו.
מוודאים שיש לכם לפחות אינדקס 2dsphere, או יוצרים אינדקס 2dsphere.
אובייקטים של GeoJSON
כדי להריץ שאילתה גיאוספציאלית על שדות באוסף, השדות שאתם שולחים לגביהם שאילתה צריכים להיות אובייקטים של GeoJSON או GeoPoint.
הרצת שאילתה גיאו-מרחבית
אפשר לבצע שאילתת מיקום גיאוגרפי באמצעות האופרטור $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בשאילתות אגרגציה.